make the forms consistant with the phoenix bootstrap

This commit is contained in:
Faheedkhan 2025-08-27 11:46:05 +03:00
parent 696daf92bd
commit 6eb77e3158
44 changed files with 1479 additions and 1680 deletions

View File

@ -2417,9 +2417,9 @@ def force_regenerate_car_image(car):
class CarImageAPIClient:
"""Simple client to handle authenticated requests to the car image API"""
BASE_URL = "http://127.0.0.1:8888"
USERNAME = "ismail.mosa.ibrahim@gmail.com"
PASSWORD = "Supremk4!"
BASE_URL = "http://10.10.1.111:8888"
USERNAME = "faheed"
PASSWORD = "Tenhal@123"
def __init__(self):
self.session = None

View File

@ -6328,6 +6328,7 @@ def lead_create(request, dealer_slug):
qs = form.fields["id_car_make"].queryset.filter(
is_sa_import=True, pk__in=dealer_make_list
)
# print(qs)
form.fields["staff"].queryset = (
form.fields["staff"]
.queryset.select_related("user")
@ -6346,10 +6347,12 @@ def lead_create(request, dealer_slug):
form.fields["staff"].queryset = models.Staff.objects.filter(
dealer=dealer, pk=request.staff.pk
)
qs = qs.order_by("name")
form.fields["id_car_make"].queryset = qs
form.fields["id_car_make"].choices = [
(obj.id_car_make, obj.get_local_name()) for obj in qs
]
]
if first_make := qs.first():
form.fields["id_car_model"].queryset = first_make.carmodel_set.all()
@ -8435,7 +8438,7 @@ class FiscalYearIncomeStatementViewBase(
"""
template_name = "ledger/reports/income_statement.html"
permission_required = ["inventory.view_carfinance"]
permission_required = ["django_ledger.view_ledgermodel"]
def get_login_url(self):
return reverse("account_login")
@ -8574,7 +8577,7 @@ class FiscalYearCashFlowStatementViewBase(
"""
template_name = "ledger/reports/cash_flow_statement.html"
permission_required = ["inventory.view_carfinance"]
permission_required = ["django_ledger.view_ledgermodel"]
def get_login_url(self):
return reverse("account_login")
@ -8763,7 +8766,7 @@ class FiscalYearEntityModelDashboardView(
:type permission_required: list
"""
permission_required = ["inventory.view_carfinance"]
permission_required = ["django_ledger.view_ledgermodel"]
def get_login_url(self):
return reverse("account_login")
@ -11433,6 +11436,10 @@ def create_ticket(request,dealer_slug):
def ticket_list(request,dealer_slug):
dealer= get_object_or_404(models.Dealer, slug=dealer_slug)
tickets = models.Ticket.objects.filter(dealer=dealer).order_by('-created_at')
query=request.GET.get('q')
if query:
tickets=tickets.filter(Q(id__icontains=query)| Q(subject__icontains=query))
return render(request, 'support/ticket_list.html', {'tickets': tickets})
@login_required

Binary file not shown.

View File

@ -20,20 +20,7 @@ msgstr ""
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: api/models.py:6 inventory/models.py:536 inventory/tables.py:51
#: templates/inventory/car_detail.html:87 templates/inventory/car_form.html:45
#: templates/inventory/car_form.html:51
#: templates/inventory/car_form_qabl alfalsafa.html:30
#: templates/inventory/car_inventory.html:65
#: templates/inventory/car_list.html:72 templates/inventory/car_list.html:78
#: templates/inventory/car_list_view.html:172
#: templates/inventory/cars_list_api.html:32
#: templates/inventory/transfer_details.html:89
#: templates/sales/estimates/estimate_detail.html:234
#: templates/sales/estimates/sale_order_form.html:123
#: templates/sales/estimates/sale_or ils.html:503
msgid "VIN"
msgstr "رقم الهيكل"
#: api/views.py:146 inventory/views.py:726
msgid "Invalid VIN number provided"
@ -560,29 +547,11 @@ msgstr "المعرض"
#: templates/bill/tags/bill_table.html:12
#: templates/inventory/car_detail.html:128
#: templates/inventory/car_form.html:155
#: templates/inventory/car_form_qabl alfalsafa.html:136
#: templates/ledger/bills/bill_list.html:50
#: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:364
#: venv/lib/python3.11/site-packages/django_ledger/models/vendor.py:191
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_table.html:12
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/vendor/tags/vendor_table.html:10
msgid "Vendor"
msgstr "المورد"
#: inventory/forms.py:1952 inventory/models.py:563 inventory/tables.py:54
#: templates/inventory/car_form.html:77
#: templates/inventory/car_form_qabl alfalsafa.html:55
#: templates/inventory/car_inventory.html:67
#: templates/inventory/car_list_view.html:124
#: templates/inventory/car_list_view.html:175
#: templates/ledger/reports/components/period_navigator.html:21
#: templates/sales/estimates/estimate_detail.html:193
#: templates/sales/estimates/sale_order_form.html:128
#: templates/sales/estimates/sale_order_preview.html:181
#: templates/sales/invoices/invoice_detail.html:240
#: templates/sales/orders/order_details.html:198
msgid "Year"
msgstr "السنة"
#: inventory/forms.py:2050 inventory/tables.py:68
#: templates/inventory/car_inventory.html:70
@ -594,12 +563,7 @@ msgstr "اللون الخارجي"
msgid "Interior Color"
msgstr "اللون الداخلي"
#: inventory/forms.py:1969 inventory/models.py:594
#: templates/inventory/car_detail.html:123
#: templates/inventory/car_form.html:188
#: templates/inventory/car_form_qabl alfalsafa.html:168
msgid "Receiving Date"
msgstr "تاريخ الاستلام"
#: inventory/forms.py:2069
msgid "File is not a CSV file"
@ -698,11 +662,7 @@ msgstr "دراجات الثلج"
msgid "logo"
msgstr "الشعار"
#: inventory/models.py:301 inventory/models.py:570 inventory/tables.py:55
#: templates/inventory/car_form.html:111
#: templates/inventory/car_form_qabl alfalsafa.html:100
msgid "Series"
msgstr "السلسلة"
#: inventory/models.py:391
msgid "Equipment"
@ -884,30 +844,7 @@ msgstr "الخدمات الإضافية"
msgid "Item Model"
msgstr "نموذج العنصر"
#: inventory/models.py:590 inventory/tables.py:50
#: templates/inventory/car_detail.html:115
#: templates/inventory/car_form.html:166
#: templates/inventory/car_form_qabl alfalsafa.html:147
#: templates/inventory/car_list.html:185
msgid "Stock Type"
msgstr "نوع المخزون"
#: inventory/models.py:592 inventory/models.py:742
#: templates/inventory/car_detail.html:133
#: templates/inventory/car_form.html:199
#: templates/inventory/car_form_qabl alfalsafa.html:181
#: templates/inventory/car_list.html:211
msgid "Remarks"
msgstr "ملاحظات"
#: inventory/models.py:593 inventory/tables.py:57
#: templates/inventory/car_detail.html:119
#: templates/inventory/car_form.html:177
#: templates/inventory/car_form_qabl alfalsafa.html:157
#: templates/inventory/car_list.html:197 templates/inventory/car_list.html:203
#: templates/sales/orders/order_details.html:206
msgid "Mileage"
msgstr "عدد الكيلومترات"
#: inventory/models.py:596
msgid "Hash"
@ -1592,12 +1529,7 @@ msgstr "الراتب"
msgid "Priority"
msgstr "الأولوية"
#: inventory/models.py:1939
#: templates/crm/opportunities/opportunity_detail.html:179
#: templates/crm/opportunities/opportunity_list copy.html:78
#: templates/crm/opportunities/partials/opportunity_grid.html:81
msgid "Expected Revenue"
msgstr "الإيرادات المتوقعة"
#: inventory/models.py:2192
msgid "Unique slug for the opportunity."
@ -1609,13 +1541,7 @@ msgstr "المُعرّف الفريد للفرصة (slug)."
msgid "Opportunity"
msgstr "فرصة"
#: inventory/models.py:2011 templates/crm/leads/lead_detail.html:170
#: templates/crm/leads/lead_detail.html:254
#: templates/crm/opportunities/opportunity_list copy.html:8
#: templates/crm/opportunities/opportunity_list.html:4
#: templates/crm/opportunities/opportunity_list.html:8
msgid "Opportunities"
msgstr "الفرص"
#: inventory/models.py:2276 inventory/models.py:2284
#: templates/account/snippets/already_logged_in.html:7
@ -2059,10 +1985,6 @@ msgstr "مصروفات الفائدة"
msgid "success"
msgstr "ناجحة"
#: inventory/utils.py:80 templates/inventory/car_form.html:397
#: templates/inventory/car_form_qabl alfalsafa.html:381
msgid "error"
msgstr "خطأ"
#: inventory/utils.py:96 templates/account/login.html:68
#: templates/account/password_change.html:38
@ -3246,17 +3168,7 @@ msgstr "يرجى إدخال رقم هاتف صالح"
msgid "Password does not match"
msgstr "كلمة المرور غير متطابقة"
#: templates/account/signup-wizard.html:252
#: templates/inventory/car_form.html:628
#: templates/inventory/car_form_qabl alfalsafa.html:608
msgid "Please Wait"
msgstr "الرجاء الإنتظار"
#: templates/account/signup-wizard.html:253
#: templates/inventory/car_form.html:629
#: templates/inventory/car_form_qabl alfalsafa.html:609
msgid "Loading"
msgstr "تحميل"
#: templates/account/signup.html:28
msgid "Sign up using a passkey"
@ -3666,65 +3578,6 @@ msgstr "تاريخ الانتهاء"
msgid "Confirm Deletion"
msgstr "تأكيد الحذف"
#: templates/administration/manage_service.html:12
#: templates/administration/service_list.html:13
#: templates/administration/staff_index.html:79
#: templates/administration/user_profile.html:18
#: templates/bill/tags/bill_item_formset.html:41
#: templates/crm/leads/lead_list.html:89 templates/crm/leads/lead_list.html:226
#: templates/crm/opportunities/opportunity_list copy.html:28
#: templates/customers/view_customer.html:23
#: templates/groups/group_detail.html:109
#: templates/ledger/bank_accounts/bank_account_detail.html:63
#: templates/ledger/coa_accounts/account_detail.html:144
#: templates/ledger/coa_accounts/partials/account_table.html:45
#: templates/ledger/journal_entry/journal_entry_delete.html:19
#: templates/ledger/journal_entry/journal_entry_list.html:102
#: templates/ledger/ledger/ledger_delete.html:19
#: templates/ledger/ledger/ledger_list.html:110
#: templates/modal/delete_modal.html:12 templates/modal/delete_modal.html:26
#: templates/modal/event_details_modal.html:33
#: templates/organizations/organization_detail.html:19
#: templates/organizations/organization_list.html:123
#: templates/plans/billing_info_create_or_update.html:14
#: templates/purchase_orders/includes/card_po.html:205
#: templates/purchase_orders/includes/po_item_formset.html:26
#: templates/purchase_orders/po_delete.html:23
#: templates/representatives/representative_detail.html:16
#: templates/sales/estimates/estimate_detail.html:29
#: templates/users/user_detail.html:60 templates/vendors/vendors_list.html:131
#: templates/vendors/view_vendor.html:39
#: venv/lib/python3.11/site-packages/appointment/templates/administration/staff_index.html:325
#: venv/lib/python3.11/site-packages/appointment/templates/administration/user_profile.html:33
#: venv/lib/python3.11/site-packages/appointment/templates/modal/event_details_modal.html:31
#: venv/lib/python3.11/site-packages/django/forms/formsets.py:499
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/bill_delete.html:28
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_item_formset.html:25
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/closing_entry_delete.html:19
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/includes/card_closing_entry.html:60
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_table.html:46
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/data_import/import_job_delete.html:18
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/data_import/tags/data_import_job_list_table.html:50
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/entity/entitiy_list.html:22
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/entity/entity_delete.html:23
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/tags/ce_item_formset.html:25
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/invoice_delete.html:24
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/tags/invoice_item_formset.html:23
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/je_delete.html:18
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_table.html:88
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/ledger/ledger_delete.html:19
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/ledger/tags/ledgers_table.html:131
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/product/product_delete.html:20
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/product/tags/product_table.html:44
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/card_po.html:103
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/po_item_formset.html:25
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/po_delete.html:24
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/service/service_delete.html:20
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/service/tags/services_table.html:44
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/uom/tags/uom_table.html:43
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/uom/uom_delete.html:28
msgid "Delete"
msgstr "حذف"
#: templates/administration/manage_service.html:29
#: templates/administration/service_list.html:23
@ -3924,12 +3777,7 @@ msgstr "أعضاء الفريق"
msgid "Add"
msgstr "إضافة"
#: templates/administration/staff_list.html:36
#: templates/crm/opportunities/opportunity_list copy.html:71
#: templates/inventory/car_form.html:246
#: templates/inventory/inventory_stats.html:63
msgid "Details"
msgstr "التفاصيل"
#: templates/administration/staff_list.html:37
msgid "View Profile"
@ -4391,23 +4239,6 @@ msgstr "المبلغ المدفوع"
msgid "Progress"
msgstr "التقدم"
#: templates/bill/includes/card_bill.html:64
#: templates/crm/opportunities/opportunity_list copy.html:55
#: templates/inventory/car_list_view.html:258
#: templates/ledger/bills/bill_list.html:84
#: templates/ledger/coa_accounts/partials/account_table.html:42
#: templates/ledger/journal_entry/includes/card_invoice.html:33
#: templates/ledger/journal_entry/journal_entry_list.html:99
#: templates/sales/invoices/invoice_list.html:61
#: templates/sales/sales_list.html:208
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/includes/card_bill.html:44
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/entity/entitiy_list.html:20
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/includes/card_invoice.html:38
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_table.html:85
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/card_po.html:22
#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/unit/unit_list.html:32
msgid "View"
msgstr "عرض"
#: templates/bill/includes/card_bill.html:58
#: templates/bill/includes/card_bill.html:207
@ -4651,17 +4482,6 @@ msgstr "تحديث الإجراءات"
msgid "created by"
msgstr "تم الإنشاء بواسطة"
#: templates/crm/leads/lead_detail.html:255
#: templates/crm/opportunities/opportunity_list copy.html:11
#: templates/crm/opportunities/opportunity_list.html:83
msgid "Add Opportunity"
msgstr "إضافة فرصة"
#: templates/crm/leads/lead_detail.html:264
#: templates/crm/opportunities/opportunity_list copy.html:110
#: templates/crm/opportunities/partials/opportunity_grid.html:104
msgid "Probability"
msgstr "الاحتمالية"
#: templates/crm/leads/lead_detail.html:452
#: templates/crm/opportunities/opportunity_detail.html:624
@ -4709,28 +4529,6 @@ msgstr "مُعين إلى"
msgid "Are you sure you want to delete this lead?"
msgstr "هل أنت متأكد أنك تريد حذف هذا العميل المحتمل؟"
#: templates/crm/leads/lead_list.html:97
#: templates/crm/opportunities/opportunity_list copy.html:158
#: templates/groups/group_detail.html:32
#: templates/inventory/car_detail.html:543
#: templates/inventory/transfer_details.html:62
#: templates/ledger/bank_accounts/bank_account_detail.html:31
#: templates/ledger/bills/bill_detail.html:24
#: templates/ledger/bills/bill_detail.html:49
#: templates/ledger/bills/bill_detail.html:121
#: templates/ledger/coa_accounts/account_detail.html:22
#: templates/ledger/coa_accounts/account_list.html:123
#: templates/ledger/journal_entry/journal_entry_list.html:25
#: templates/organizations/organization_list.html:96
#: templates/sales/estimates/estimate_detail.html:37
#: templates/sales/estimates/estimate_detail.html:64
#: templates/sales/invoices/invoice_detail.html:31
#: templates/sales/invoices/invoice_detail.html:56
#: templates/sales/invoices/invoice_detail.html:142
#: venv/lib/python3.11/site-packages/appointment/models.py:530
#: venv/lib/python3.11/site-packages/django/forms/widgets.py:867
msgid "Yes"
msgstr "نعم"
#: templates/crm/leads/lead_list.html:159
msgid "In Progress"
@ -4740,23 +4538,7 @@ msgstr "قيد التنفيذ"
msgid "View Schedules"
msgstr "عرض الجداول"
#: templates/crm/leads/lead_list.html:214
#: templates/crm/opportunities/opportunity_list copy.html:27
#: templates/dealers/dealer_detail.html:22
#: templates/groups/group_detail.html:103
#: templates/inventory/car_detail.html:218
#: templates/inventory/car_detail.html:276
#: templates/inventory/car_detail.html:326
#: templates/ledger/bank_accounts/bank_account_detail.html:57
#: templates/ledger/coa_accounts/account_detail.html:140
#: templates/modal/event_details_modal.html:41
#: templates/organizations/organization_detail.html:26
#: templates/organizations/organization_list.html:161
#: templates/representatives/representative_detail.html:22
#: templates/users/user_detail.html:81 templates/vendors/vendors_list.html:132
#: templates/vendors/view_vendor.html:34
msgid "Edit"
msgstr "تحديث"
#: templates/crm/leads/lead_list.html:253
msgid "Convert to Opportunity"
@ -4799,28 +4581,7 @@ msgstr "اختر الإجراء التالي"
msgid "No Action"
msgstr "لا يوجد إجراء"
#: templates/crm/leads/partials/update_action.html:47
#: templates/inventory/car_form.html:250 templates/inventory/car_form.html:269
#: templates/inventory/car_form.html:287 templates/inventory/car_form.html:304
#: templates/inventory/car_form_qabl alfalsafa.html:229
#: templates/inventory/car_form_qabl alfalsafa.html:235
#: templates/inventory/car_form_qabl alfalsafa.html:252
#: templates/inventory/car_form_qabl alfalsafa.html:270
#: templates/inventory/car_form_qabl alfalsafa.html:287
#: templates/modal/confirm_modal.html:11 templates/modal/confirm_modal.html:20
#: templates/modal/error_modal.html:17
#: templates/modal/event_details_modal.html:21
#: templates/partials/scanner_modal.html:6
#: templates/partials/specifications_modal.html:8
#: templates/sales/orders/order_details.html:583
#: templates/sales/orders/order_details.html:587
#: templates/sales/orders/order_details.html:621
#: templates/sales/orders/order_details.html:625
#: venv/lib/python3.11/site-packages/appointment/templates/modal/confirm_modal.html:18
#: venv/lib/python3.11/site-packages/appointment/templates/modal/error_modal.html:17
#: venv/lib/python3.11/site-packages/appointment/templates/modal/event_details_modal.html:19
msgid "Close"
msgstr "إغلاق"
#: templates/crm/notifications.html:17
#: templates/crm/notifications_history.html:14
@ -4933,44 +4694,7 @@ msgstr "تحديث المرحلة مع تقدم الصفقة"
msgid "Set realistic closing dates"
msgstr "تحديد تواريخ إغلاق واقعية"
#: templates/crm/opportunities/opportunity_list copy.html:89
msgid "Contact"
msgstr "جهة الاتصال"
#: templates/crm/opportunities/opportunity_list copy.html:100
#: templates/crm/opportunities/partials/opportunity_grid.html:93
#: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:75
msgid "Closing Date"
msgstr "تاريخ الإغلاق"
#: templates/crm/opportunities/opportunity_list copy.html:145
msgid "Delete Opportunity"
msgstr "حذف الفرصة"
#: templates/crm/opportunities/opportunity_list copy.html:152
msgid "Are you sure you want to delete this opportunity?"
msgstr "هل أنت متأكد أنك تريد حذف هذه الفرصة؟"
#: templates/crm/opportunities/opportunity_list copy.html:155
#: templates/groups/group_detail.html:27
#: templates/inventory/car_detail.html:577
#: templates/inventory/car_list_view.html:260
#: templates/inventory/transfer_details.html:29
#: templates/inventory/transfer_details.html:60
#: templates/ledger/bank_accounts/bank_account_detail.html:26
#: templates/ledger/bills/bill_detail.html:26
#: templates/ledger/bills/bill_detail.html:59
#: templates/ledger/bills/bill_detail.html:184
#: templates/ledger/coa_accounts/account_detail.html:23
#: templates/ledger/coa_accounts/account_list.html:189
#: templates/ledger/journal_entry/journal_entry_list.html:34
#: templates/organizations/organization_list.html:118
#: templates/sales/estimates/estimate_detail.html:72
#: templates/sales/invoices/invoice_detail.html:36
#: templates/sales/invoices/invoice_detail.html:73
#: templates/sales/invoices/invoice_detail.html:229
msgid "No"
msgstr "لا"
#: templates/crm/opportunities/opportunity_list.html:20
msgid "Search opportunities..."
@ -5811,39 +5535,7 @@ msgstr "هذه السيارة محجوزة حتى "
msgid "year"
msgstr "السنة"
#: templates/inventory/car_detail.html:95 templates/inventory/car_form.html:87
#: templates/inventory/car_form_qabl alfalsafa.html:70
#: templates/inventory/car_list.html:89
msgid "make"
msgstr "الصانع"
#: templates/inventory/car_detail.html:99 templates/inventory/car_form.html:98
#: templates/inventory/car_form_qabl alfalsafa.html:83
#: templates/inventory/car_list.html:107
msgid "model"
msgstr "الموديل"
#: templates/inventory/car_detail.html:108
#: templates/inventory/car_list.html:141
msgid "series"
msgstr "السلسلة"
#: templates/inventory/car_detail.html:107
#: templates/inventory/car_form.html:121
#: templates/inventory/car_form_qabl alfalsafa.html:117
#: templates/inventory/car_list.html:151
msgid "trim"
msgstr "الفئة"
#: templates/inventory/car_detail.html:137
#: templates/inventory/car_detail.html:560
#: templates/inventory/car_form.html:133 templates/inventory/car_form.html:238
#: templates/inventory/car_form_qabl alfalsafa.html:196
#: templates/inventory/car_form_qabl alfalsafa.html:225
#: templates/inventory/car_form_qabl alfalsafa.html:248
#: templates/inventory/car_list.html:49 templates/inventory/car_list.html:235
msgid "specifications"
msgstr "المواصفات"
#: templates/inventory/car_detail.html:211
#: templates/inventory/car_inventory.html:125
@ -5976,77 +5668,7 @@ msgstr "مسح رقم الهيكل"
msgid "Decode VIN"
msgstr "تحليل رقم الهيكل"
#: templates/inventory/car_form.html:96 templates/inventory/car_form.html:109
#: templates/inventory/car_form.html:119 templates/inventory/car_form.html:279
#: templates/inventory/car_form.html:468 templates/inventory/car_form.html:485
#: templates/inventory/car_form.html:486 templates/inventory/car_form.html:508
#: templates/inventory/car_form.html:527
#: templates/inventory/car_form_qabl alfalsafa.html:88
#: templates/inventory/car_form_qabl alfalsafa.html:104
#: templates/inventory/car_form_qabl alfalsafa.html:121
#: templates/inventory/car_form_qabl alfalsafa.html:262
#: templates/inventory/car_form_qabl alfalsafa.html:451
#: templates/inventory/car_form_qabl alfalsafa.html:468
#: templates/inventory/car_form_qabl alfalsafa.html:469
#: templates/inventory/car_form_qabl alfalsafa.html:489
#: templates/inventory/car_form_qabl alfalsafa.html:508
#: templates/plans/plan_table.html:120
msgid "Select"
msgstr "اختيار"
#: templates/inventory/car_form.html:139
#: templates/inventory/car_form_qabl alfalsafa.html:202
#: templates/inventory/car_list.html:26 templates/inventory/car_list.html:229
msgid "options"
msgstr "الخيارات"
#: templates/inventory/car_form.html:211
#: templates/inventory/car_form_qabl alfalsafa.html:206
msgid "Save and Add Another"
msgstr "حفظ وإضافة آخر"
#: templates/inventory/car_form.html:217
#: templates/inventory/car_form_qabl alfalsafa.html:210
msgid "Save and Go to Inventory"
msgstr "حفظ والانتقال إلى المخزون"
#: templates/inventory/car_form.html:286
msgid "Options"
msgstr "الخيارات"
#: templates/inventory/car_form.html:275
#: templates/inventory/car_form_qabl alfalsafa.html:258
#: templates/inventory/car_list.html:162
msgid "equipment"
msgstr "التجهيزات"
#: templates/inventory/car_form.html:300
#: templates/inventory/car_form_qabl alfalsafa.html:283
msgid "scanner"
msgstr "الماسح الضوئي"
#: templates/inventory/car_form.html:309
#: templates/inventory/car_form_qabl alfalsafa.html:292
#: templates/partials/scanner_modal.html:10
msgid "VIN will appear here."
msgstr "رقم الهيكل سيظهر هنا."
#: templates/inventory/car_form.html:310
#: templates/inventory/car_form_qabl alfalsafa.html:293
#: templates/partials/scanner_modal.html:11
msgid "Use OCR Fallback"
msgstr "التعرف الآلي على الحروف"
#: templates/inventory/car_form.html:379 templates/inventory/car_form.html:380
#: templates/inventory/car_form_qabl alfalsafa.html:363
#: templates/inventory/car_form_qabl alfalsafa.html:364
msgid "Please enter a valid VIN."
msgstr "الرجاء إدخال رقم هيكل صالح مكون من 17 حرفًا."
#: templates/inventory/car_form.html:402
#: templates/inventory/car_form_qabl alfalsafa.html:386
msgid "An error occurred while decoding the VIN."
msgstr "حدث خطأ أثناء فك تشفير الهيكل"
#: templates/inventory/car_history.html:24
msgid "History"

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

View File

@ -3,52 +3,45 @@
{% load i18n static %}
{% load allauth account %}
{% block title %}
{% trans 'User Settings' %}
{% trans 'Dealer Settings' %}
{% endblock %}
{% block content %}
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
Dealer Settings
<span class="fas fa-solid fa-gear ms-2 text-primary"></span>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-md-6">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% trans "Dealer Settings" %}
<i class="fas fa-solid fa-gear ms-2"></i>
</h3>
</div>
<div class="card-body bg-light-subtle ">
<form action="" method="post">
{% csrf_token %}
<div class="col-12">
<div class=" mb-4">
<div class="row gx-3 mb-4 gy-6 gy-sm-3">
<div class="col-12">
<h4 class="mb-4">{% trans 'Default Invoice Accounts' %}</h4>
<div class="form-icon-container mb-3">{{ form.invoice_cash_account|as_crispy_field }}</div>
<div class="form-icon-container mb-3">{{ form.invoice_prepaid_account|as_crispy_field }}</div>
<div class="form-icon-container mb-3">{{ form.invoice_unearned_account|as_crispy_field }}</div>
</div>
</div>
<div class="row gx-3 mb-4 gy-6 gy-sm-3">
<div class="col-12">
<h4 class="mb-4">{% trans 'Default Bill Accounts' %}</h4>
<div class="form-icon-container mb-3">{{ form.bill_cash_account|as_crispy_field }}</div>
<div class="form-icon-container mb-3">{{ form.bill_prepaid_account|as_crispy_field }}</div>
<div class="form-icon-container mb-3">{{ form.bill_unearned_account|as_crispy_field }}</div>
</div>
</div>
<div class="text-center mb-6">
<div>
<button type="submit" class="btn btn-phoenix-primary"><i class="fa-solid fa-pen-to-square me-1"></i>{% trans 'Update' %}</button>
</div>
</div>
</div>
</div>
</form>
<div class="card-body p-4 p-md-5">
<form action="" method="post" class="needs-validation" novalidate>
{% csrf_token %}
<div class="row g-1">
<div class="col-12">
<h4 class="mb-4 text-center">{% trans 'Default Invoice Accounts' %}</h4>
{{ form.invoice_cash_account|as_crispy_field }}
{{ form.invoice_prepaid_account|as_crispy_field }}
{{ form.invoice_unearned_account|as_crispy_field }}
</div>
<div class="col-12 mt-4">
<h4 class="mb-4 text-center">{% trans 'Default Bill Accounts' %}</h4>
{{ form.bill_cash_account|as_crispy_field }}
{{ form.bill_prepaid_account|as_crispy_field }}
{{ form.bill_unearned_account|as_crispy_field }}
</div>
</div>
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg" type="submit">
<i class="fa-solid fa-pen-to-square me-1"></i>
{% trans 'Update' %}
</button>
</div>
</form>
</div>
</div>
</div>
{% endblock %}
</main>
{% endblock %}

View File

@ -8,50 +8,46 @@
{% endblock title %}
{% block content %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% trans 'Create Bill' %}<span class="fas fa-money-bills ms-2 text-primary"></span>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5 ">
<div class="col-md-6">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% trans 'Create Bill' %}
<i class="fas fa-money-bills ms-2"></i>
</h3>
</div>
<div class="card-body bg-light-subtle">
<form action="{{ form_action_url }}" method="post" id="djl-bill-model-create-form-id">
<div class="card-body">
{% csrf_token %}
{% if po_model %}
<div class="text-center mb-4">
<h3 class="h5">{% trans 'Bill for' %} {{ po_model.po_number }}</h3>
<p class="text-muted mb-3">{% trans 'Bill for' %} {{ po_model.po_title }}</p>
<div class="d-flex flex-column gap-2">
{% for itemtxs in po_itemtxs_qs %}
<span class="badge bg-secondary">{{ itemtxs }}</span>
{% endfor %}
</div>
<div class="card-body p-4 p-md-5">
<form action="{{ form_action_url }}" method="post" id="djl-bill-model-create-form-id" class="needs-validation" novalidate>
{% csrf_token %}
{% if po_model %}
<div class="text-center mb-4">
<h3 class="h5">{% trans 'Bill for' %} {{ po_model.po_number }}</h3>
<p class="text-muted mb-3">{% trans 'Bill for' %} {{ po_model.po_title }}</p>
<div class="d-flex flex-column gap-2">
{% for itemtxs in po_itemtxs_qs %}
<span class="badge bg-secondary">{{ itemtxs }}</span>
{% endfor %}
</div>
{% endif %}
<div class="mb-4">
{{ form|crispy }}
</div>
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'bill_list' request.dealer.slug%}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
{% endif %}
<div class="mb-4">
{{ form|crispy }}
</div>
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'bill_list' request.dealer.slug%}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock %}
</main>
{% endblock %}

View File

@ -1,54 +1,59 @@
{% extends 'base.html' %}
{% load i18n %}
{% load static %}
{% load i18n static %}
{% load django_ledger %}
{% load widget_tweaks %}
{% block content %}
<div class="container py-5">
<div class="row justify-content-center">
<div class="col-12 text-center mb-4">
<h1 class="display-4">{% trans 'Create Chart of Accounts' %}</h1>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% trans 'Create Chart of Accounts' %}
<i class="fa-solid fa-chart-pie ms-2"></i>
</h3>
</div>
<div class="col-lg-6 col-md-8">
<div class="card shadow-sm">
<div class="card-body p-4">
<form method="post" id="{{ form.get_form_id }}">
{% csrf_token %}
{# Bootstrap form rendering #}
<div class="mb-3">
{{ form.name.label_tag }}
{{ form.name|add_class:"form-control" }}
{% if form.name.help_text %}
<small class="form-text text-muted">{{ form.name.help_text }}</small>
{% endif %}
{% for error in form.name.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
{% endfor %}
</div>
<div class="mb-3">
{{ form.description.label_tag }}
{{ form.description|add_class:"form-control" }}
{% if form.description.help_text %}
<small class="form-text text-muted">{{ form.description.help_text }}</small>
{% endif %}
{% for error in form.description.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
{% endfor %}
</div>
<div class="d-flex justify-content-center gap-2 mt-4">
<button type="submit" class="btn btn-phoenix-primary">Submit</button>
<a href="{% url 'coa-list' request.dealer.slug request.entity.slug %}" class="btn btn-phoenix-secondary">
{% trans 'Back' %}
</a>
</div>
</form>
<div class="card-body p-4 p-md-5">
<form method="post" id="{{ form.get_form_id }}" class="needs-validation" novalidate>
{% csrf_token %}
{# Bootstrap form rendering #}
<div class="mb-3">
{{ form.name.label_tag }}
{{ form.name|add_class:"form-control" }}
{% if form.name.help_text %}
<small class="form-text text-muted">{{ form.name.help_text }}</small>
{% endif %}
{% for error in form.name.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
{% endfor %}
</div>
</div>
<div class="mb-3">
{{ form.description.label_tag }}
{{ form.description|add_class:"form-control" }}
{% if form.description.help_text %}
<small class="form-text text-muted">{{ form.description.help_text }}</small>
{% endif %}
{% for error in form.description.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
{% endfor %}
</div>
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button type="submit" class="btn btn-phoenix-primary btn-lg me-md-2">
<i class="fa-solid fa-plus me-1"></i>
{% trans 'Create' %}
</button>
<a href="{% url 'coa-list' request.dealer.slug request.entity.slug %}"
class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans 'Cancel' %}
</a>
</div>
</form>
</div>
</div>
</div>
</main>
{% endblock %}

View File

@ -1,5 +1,6 @@
{% extends 'base.html' %}
{% load i18n static crispy_forms_filters %}
{% block title %}
{% if object %}
{% trans 'Update Lead' %}
@ -7,6 +8,7 @@
{% trans 'Add New Lead' %}
{% endif %}
{% endblock %}
{% block customcss %}
<style>
.htmx-indicator{
@ -28,51 +30,41 @@
}
</style>
{% endblock customcss %}
{% block content %}
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% if object %}
{{ _("Update Lead") }}
{% else %}
{{ _("Create New Lead") }}
{% endif %}
<li class="fas fa-bullhorn text-primary ms-2"></li>
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="form" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form|crispy }}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'lead_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
<main class="d-flex align-items-center justify-content-center min-vh-100 py-5">
<div class="col-md-8">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% if object %}
{% trans "Update Lead" %}
<i class="fa-solid fa-edit ms-2"></i>
{% else %}
{% trans "Create New Lead" %}
<i class="fa-solid fa-bullhorn ms-2"></i>
{% endif %}
</h3>
</div>
<div class="card-body p-4 p-md-5">
<form class="form" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form|crispy }}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{% trans "Save" %}
</button>
<a href="{% url 'lead_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const spinner = document.createElement('div');
spinner.id = 'spinner';
spinner.className = 'htmx-indicator spinner-border text-primary inline-spinner';
spinner.innerHTML = '<span class="visually-hidden">Loading...</span>';
const targetFieldDiv = document.getElementById('div_id_id_car_model');
if (targetFieldDiv) {
targetFieldDiv.parentNode.insertBefore(spinner, targetFieldDiv.nextSibling);
}
});
</script>
{% endblock %}
</main>
{% endblock %}

View File

@ -1,42 +1,60 @@
{% extends "base.html" %}
{% load i18n static %}
{% load crispy_forms_filters %}
{% block title %}
{# Check if an 'object' exists in the context #}
{% if object %}
{% trans 'Update Customer' %}
{% else %}
{% trans 'Add New Customer' %}
{% endif %}
{% endblock %}
{% block content %}
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-o rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% if customer.created %}
{{ _("Edit Customer") }}
{% else %}
{{ _("Add Customer") }}
{% endif %}
<i class="fa-solid fa-user ms-2 text-primary"></i>
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post"
class="form row g-3 needs-validation"
enctype="multipart/form-data"
novalidate>
{% csrf_token %}
{{ form|crispy }}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'customer_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
<main class="d-flex align-items-center justify-content-center min-vh-100 py-5 ">
<div class="col-md-8">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% if object %}
{% trans "Update Customer" %}
<i class="fa-solid fa-user-edit ms-2"></i>
{% else %}
{% trans "Add New Customer" %}
<i class="fa-solid fa-user-plus ms-2"></i>
{% endif %}
</h3>
</div>
<div class="card-body p-4 p-md-5">
<form method="post" class="form" enctype="multipart/form-data" novalidate>
{% csrf_token %}
{{ form|crispy }}
{% if form.errors %}
<div class="alert alert-danger mt-4" role="alert">
<h4 class="alert-heading small">{% trans "Please correct the following errors:" %}</h4>
<ul class="mb-0">
{% for field, errors in form.errors.items %}
<li><strong>{{ field|capfirst }}:</strong> {% for error in errors %}{{ error }}{% endfor %}</li>
{% endfor %}
</ul>
</div>
</form>
</div>
{% endif %}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{% trans "Save" %}
</button>
<a href="{% url 'customer_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
{% endblock %}
</div>
</main>
{% endblock %}

View File

@ -5,32 +5,34 @@
{{ _("Update Dealer Information") }}
{% endblock title %}
{% block content %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{{ _("Update Dealer Information") }}<span class="fas fa-car ms-2 text-primary"></span>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-md-8">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{{ _("Update Dealer Information") }}
<i class="fas fa-car ms-2"></i>
</h3>
</div>
<div class="card-body bg-light-subtle">
<div class="card-body p-4 p-md-5">
<form hx-boost="false" method="post" enctype="multipart/form-data" class="needs-validation" novalidate>
{% csrf_token %}
{{ form|crispy }}
<hr class="my-2">
{% csrf_token %}
{{ form|crispy }}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'dealer_detail' request.dealer.slug %}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'dealer_detail' request.dealer.slug %}"
class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock %}
</main>
{% endblock %}

View File

@ -2,7 +2,7 @@
{% load i18n %}
{% load crispy_forms_filters %}
{% block title %}
{# Check if an 'object' exists in the context #}
{# Check if an 'object' exists in the context #}
{% if object %}
{% trans 'Update Group' %}
{% else %}
@ -10,41 +10,49 @@
{% endif %}
{% endblock %}
{% block content %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% if staff.created %}
{{ _("Edit Group") }}
{% else %}
{{ _("Create Group") }}
{% endif %}
<i class="fa-solid fa-user-group text-primary ms-2"></i>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% if object %}
{% trans "Update Group" %}
<i class="fa-solid fa-user-group ms-2"></i>
{% else %}
{% trans "Create Group" %}
<i class="fa-solid fa-user-plus ms-2"></i>
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="row g-3 " method="post" class="form" novalidate>
<div class="card-body p-4 p-md-5">
<form method="post" class="needs-validation" novalidate>
{% csrf_token %}
{{ redirect_field }}
{{ form|crispy }}
{% for error in form.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'group_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
{% if form.errors %}
<div class="alert alert-danger mt-4" role="alert">
<h4 class="alert-heading small">{% trans "Please correct the following errors:" %}</h4>
<ul class="mb-0">
{% for field, errors in form.errors.items %}
<li><strong>{{ field|capfirst }}:</strong> {% for error in errors %}{{ error }}{% endfor %}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center">
<button class="btn btn-phoenix-primary btn-lg md-me-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>{% trans "Save" %}
</button>
<a href="{% url 'group_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock %}
</main>
{% endblock %}

View File

@ -6,62 +6,70 @@
{% trans "Groups" %}
{% endblock title %}
{% block content %}
{% if groups or request.GET.q%}
<section class="">
<div class="row mt-4">
<div class="col-auto">
<div class="d-md-flex justify-content-between">
<div>
<main class="py-5">
<div class="container">
{% if groups or request.GET.q %}
<div class="card border-0 rounded-4 animate__animated animate__fadeInUp">
<div class="card-header border-bottom d-flex flex-column flex-md-row justify-content-between align-items-md-center p-4">
<h5 class="card-title mb-2 mb-md-0 me-md-4 fw-bold"> <i class="fa-solid fa-user-group fs-3 me-1 text-primary "></i>{% trans "Groups" %}</h5>
<div class="d-flex gap-2">
<a href="{% url 'group_create' request.dealer.slug %}"
class="btn btn-sm btn-phoenix-primary me-5"><span class="fas fa-plus me-2"></span>{% trans "Add Group" %}</a>
class="btn btn-phoenix-primary">
<i class="fa-solid fa-user-group fs-9 me-1"></i>
<span class="fas fa-plus me-2"></span>{% trans "Add Group" %}
</a>
<a href="{% url 'user_list' request.dealer.slug %}"
class="btn btn-sm btn-phoenix-secondary"><span class="fas fas fa-arrow-left me-2"></span>{% trans "Back to Staffs" %}</a>
class="btn btn-phoenix-secondary">
<span class="fas fas fa-arrow-left me-2"></span>{% trans "Back to Staffs" %}
</a>
</div>
</div>
</div>
<div class="table-responsive scrollbar mx-n1 px-1 mt-3">
<table class="table align-items-center table-flush table-hover">
<thead>
<tr class="bg-body-highlight">
<th>{% trans 'name'|capfirst %}</th>
<th>{% trans 'total Users'|capfirst %}</th>
<th>{% trans 'total permission'|capfirst %}</th>
<th>{% trans 'actions'|capfirst %}</th>
</tr>
</thead>
<tbody>
{% for group in groups %}
<tr>
<td class="align-middle white-space-nowrap ps-1">{{ group.name }}</td>
<td class="align-middle white-space-nowrap">
<i class="fa-solid fa-users me-1"></i> {{ group.users.count }}
</td>
<td class="align-middle white-space-nowrap">
<i class="fa-solid fa-unlock me-1"></i> {{ group.permissions.count }}
</td>
<td class="align-middle white-space-nowrap">
<a class="btn btn-phoenix-success"
href="{% url 'group_detail' request.dealer.slug group.id %}">
<i class="fa-solid fa-eye"></i>
{% trans 'view'|capfirst %}
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% if page_obj.paginator.num_pages > 1 %}
<div class="d-flex justify-content-end mt-3">
<div class="d-flex">{% include 'partials/pagination.html' %}</div>
<div class="card-body p-0">
<div class="table-responsive scrollbar mx-n1 px-1 mt-3">
<table class="table align-items-center table-hover mb-0">
<thead>
<tr class="bg-light">
<th scope="col" class="text-secondary text-uppercase fw-bold ps-4">{% trans 'name'|capfirst %}</th>
<th scope="col" class="text-secondary text-uppercase fw-bold">{% trans 'total Users'|capfirst %}</th>
<th scope="col" class="text-secondary text-uppercase fw-bold">{% trans 'total permission'|capfirst %}</th>
<th scope="col" class="text-secondary text-uppercase fw-bold text-end pe-4">{% trans 'actions'|capfirst %}</th>
</tr>
</thead>
<tbody>
{% for group in groups %}
<tr>
<td class="align-middle white-space-nowrap ps-4">{{ group.name }}</td>
<td class="align-middle white-space-nowrap">
<i class="fa-solid fa-users me-1"></i> {{ group.users.count }}
</td>
<td class="align-middle white-space-nowrap">
<i class="fa-solid fa-unlock me-1"></i> {{ group.permissions.count }}
</td>
<td class="align-middle white-space-nowrap text-end pe-4">
<a class="btn btn-phoenix-secondary btn-sm"
href="{% url 'group_detail' request.dealer.slug group.id %}">
<i class="fa-solid fa-eye me-1"></i>
{% trans 'view'|capfirst %}
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endif %}
</div>
</section>
{% else %}
{% url "group_create" request.dealer.slug as create_group_url %}
{% include "empty-illustration-page.html" with value="group" url=create_group_url %}
{% endif %}
{% endblock %}
{% if page_obj.paginator.num_pages > 1 %}
<div class="card-footer bg-light border-top">
<div class="d-flex justify-content-end">
{% include 'partials/pagination.html' %}
</div>
</div>
{% endif %}
</div>
{% else %}
{% url "group_create" request.dealer.slug as create_group_url %}
{% include "empty-illustration-page.html" with value="group" url=create_group_url %}
{% endif %}
</div>
</main>
{% endblock %}

View File

@ -3,10 +3,10 @@
<nav class="navbar navbar-vertical navbar-expand-lg ">
<div class="collapse navbar-collapse" id="navbarVerticalCollapse">
<div class="navbar-vertical-content d-flex flex-column">
<ul class="navbar-nav flex-column" id="navbarVerticalNav" hx-boost="true" hx-target="#main_content" hx-select="#main_content" hx-swap="outerHTML" hx-select-oob="#toast-container" hx-indicator="#spinner">
<ul class="navbar-nav flex-column" id="navbarVerticalNav" hx-boost="false" hx-target="#main_content" hx-select="#main_content" hx-swap="outerHTML" hx-select-oob="#toast-container" hx-indicator="#spinner">
<li class="nav-item">
<p class="navbar-vertical-label text-primary fs-8 text-truncate">{{request.dealer|default:"Apps"}}</p>
<hr class="navbar-vertical-line">
{% comment %} <p class="navbar-vertical-label text-primary fs-8 text-truncate">{{request.dealer|default:"Apps"}}</p>
<hr class="navbar-vertical-line"> {% endcomment %}
{% if perms.inventory.can_view_inventory %}
<div class="nav-item-wrapper">
<a id="inventory-nav" class="nav-link dropdown-indicator label-1 inventory-nav" href="#nv-inventory" role="button" data-bs-toggle="collapse" aria-expanded="false" aria-controls="nv-inventory">
@ -386,7 +386,7 @@
</a>
</li>
<li class="nav-item">
<li class="nav-item mb-4">
<a class="nav-link" href="#">
<div class="d-flex align-items-center">
<span class="nav-link-icon"><span class="fas fa-robot"></span></span>
@ -394,9 +394,22 @@
</div>
</a>
</li>
<li class="nav-item ">
<a class="nav-link" href="#">
<div class="d-flex align-items-center">
{% if user.is_authenticated %}
<span class="nav-link-icon"><span class="fa-solid fa-car"></span></span>
<span class="nav-link-text">{{ request.dealer.user.username }}</span>
{% endif %}
</div>
</a>
</li>
</ul>
</div>
{% endif %}
</div>
@ -437,11 +450,11 @@
<div class="navbar-logo">
<div class="d-flex align-items-center">
{% with name_to_display=request.user.first_name|default:request.dealer.name %}
<h6 class="text-info ms-2 d-none d-sm-block fs-7"
<h6 class="text-gray-600 ms-2 d-none d-sm-block fs-8"
data-bs-toggle="tooltip"
data-bs-placement="bottom"
title="{% trans 'Logged in as ' %}{{request.user.username }}">
{% trans 'Hello, ' %}{{ name_to_display }}
{% trans 'Hello, ' %}{{ name_to_display }}
</h6>
{% endwith %}
</div>

View File

@ -1,16 +1,41 @@
<!-- templates/cars/car_confirm_delete.html -->
{% extends 'base.html' %}
{% load i18n %}
{% block title %}Delete Car{% endblock %}
{% block content %}
<div class="mt-4 ms-4">
<h1>Delete Car</h1>
<p class="text-danger">Are you sure you want to delete the car "{{ car }}"?</p>
<form method="post">
{% csrf_token %}
<button type="submit" class="btn btn-phoenix-danger">Confirm Delete</button>
<a href="{% url 'car_list' request.dealer.slug %}"
class="btn btn-phoenix-secondary">{% trans 'Cancel' %}</a>
</form>
<main class="d-flex align-items-center justify-content-center min-vh-50 py-5">
<div class="col-md-6 ">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-body p-4 p-md-5 text-center bg-gradient">
<div class="mb-4">
<i class="fa-solid fa-triangle-exclamation text-danger" style="font-size: 2rem;"></i>
</div>
<h1 class="card-title fw-bold mb-3 fs-4">{% trans 'Confirm Deletion' %}</h1>
<p class="fs-7 mb-4">
{% trans "Are you absolutely sure you want to delete the car" %}
</p>
<p class="fs-6 mb-4">
"<strong class="">{{ car }}</strong>"?
</p>
<p class="fs-7 mb-4">
{% trans "This action is permanent and cannot be undone." %}
</p>
<form method="post" class="d-grid gap-3 d-sm-flex justify-content-sm-center">
{% csrf_token %}
<button type="submit" class="btn btn-phoenix-danger btn-lg px-5">
<i class="fa-solid fa-trash-can me-2"></i>{% trans 'Confirm Delete' %}
</button>
<a href="{% url 'car_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg px-5">
<i class="fa-solid fa-ban me-2"></i>{% trans 'Cancel' %}
</a>
</form>
</div>
</div>
</div>
{% endblock %}
</main>
{% endblock %}

View File

@ -76,13 +76,279 @@
{% if perms.inventory.view_car %}
<div class="row-fluid {% if car.status == 'sold' %}disabled{% endif %}">
<div class="row g-3 justify-content-between">
<div class="col-lg-12 col-xl-6">
<div class="avatar avatar-5xl mb-3">
<img class="rounded h-100 w-100"
src="{% static 'images/car_images/' %}{{ car.get_hash }}.png"
alt="{{ car.vin }}" />
</div>
<div class="card mb-3 rounded shadow d-flex align-content-center
<div class="col-md-6">
<div class="row mb-2">
<div class="col-md-4">
<div class="avatar avatar-6xl mb-3">
<img class="rounded"
src="{% static 'images/car_images/' %}{{ car.get_hash }}.png"
alt="{{ car.vin }}" />
</div>
</div>
<div class="col-md-8">
<div class="card rounded shadow d-flex align-content-center
{% if car.get_transfer %}transfer{% endif %}">
<p class="card-header rounded-top fw-bold">{% trans 'Financial Details' %}</p>
<div class="card-body">
<div class="table-responsive scrollbar mb-3">
<table class="table table-sm fs-9 mb-0 overflow-hidden">
{% if car.marked_price %}
<tr>
<th>{% trans "Cost Price"|capfirst %}</th>
<td>{{ car.cost_price|floatformat:2 }}</td>
</tr>
<tr>
<th>{% trans "Marked Price"|capfirst %}</th>
<td>{{ car.marked_price|floatformat:2 }}</td>
</tr>
{% comment %} <tr>
<th>{% trans "Selling Price"|capfirst %}</th>
<td>{{ car.finances.selling_price|floatformat:2 }}</td>
</tr>
<tr>
<th>{% trans "Discount Amount"|capfirst %}</th>
<td>{{ car.finances.discount_amount|floatformat:2 }}</td>
</tr>
<tr>
<th>{% trans "Additional Fee"|capfirst %}</th>
<td></td>
</tr>
{% if car.finances.additional_services.first.pk %}
{% for service in car.finances.additional_services.all %}
<tr>
<td>{{ service.name }}</td>
<td>{{ service.price_|floatformat:2 }}</td>
</tr>
{% endfor %}
{% endif %}
<tr>
<th>{% trans "VAT Amount"|capfirst %}</th>
<td>{{ car.finances.vat_amount|floatformat:2 }}</td>
</tr>
<tr>
<th>{% trans "Total"|capfirst %}</th>
<td>{{ car.finances.total_vat|floatformat:2 }}</td>
</tr> {% endcomment %}
<tr>
<td colspan="2">
{% if not car.get_transfer %}
<a href="{% url 'car_finance_update' request.dealer.slug car.slug %}"
class="btn btn-phoenix-warning btn-sm mb-3">{% trans "Edit" %}</a>
{% else %}
<span class="badge bg-danger">{% trans "Cannot Edit, Car in Transfer." %}</span>
{% endif %}
</td>
</tr>
{% else %}
<p>{% trans "No finance details available." %}</p>
<a href="{% url 'car_finance_update' request.dealer.slug car.slug %}"
class="btn btn-phoenix-success btn-sm mb-3">{% trans "Add" %}</a>
{% endif %}
</table>
</div>
</div>
</div>
</div>
</div>
{% if perms.inventory.view_carcolors %}
<div class="card rounded shadow d-flex align-content-center mt-3
{% if car.get_transfer %}transfer{% endif %}">
<p class="card-header rounded-top fw-bold">{% trans 'Colors Details' %}</p>
<div class="card-body">
<div class="table-responsive scrollbar mb-3">
<table class="table table-sm fs-9 mb-0 overflow-hidden">
<!--test-->
{% if car.colors %}
<tr>
<th>{% trans 'Exterior' %}</th>
<td>
<span>{{ car.colors.exterior.get_local_name }}</span>
</td>
<td class="align-middle">
<div class="text-end color-div"
style="background-color: rgb({{ car.colors.exterior.rgb }})">
</div>
</td>
</tr>
<tr>
<th>{% trans 'Interior' %}</th>
<td>
<span>{{ car.colors.interior.get_local_name }}</span>
</td>
<td class="align-middle">
<div class="text-end color-div"
style="background-color: rgb({{ car.colors.interior.rgb }})">
</div>
</td>
</tr>
{% if perms.inventory.change_carcolors %}
<tr>
<td colspan="2">
{% if not car.get_transfer %}
<a href="{% url 'car_colors_update' request.dealer.slug car.slug %}"
class="btn btn-phoenix-warning btn-sm mb-3">{% trans "Edit" %}</a>
{% else %}
<span class="badge bg-danger">{% trans "Cannot Edit, Car in Transfer." %}</span>
{% endif %}
</td>
</tr>
{% endif %}
{% else %}
<tr>
<td colspan="2">
<p>{% trans "No color details available." %}</p>
{% if perms.inventory.add_carcolors %}
<a class="btn btn-phoenix-success btn-sm mb-3"
href="{% url 'add_color' request.dealer.slug car.slug %}">{{ _("Add Color") }}</a>
{% endif %}
</td>
</tr>
{% endif %}
<!--test-->
</table>
</div>
</div>
</div>
{% endif %}
{% if car.status != 'transfer' %}
{% if perms.inventory.view_carreservation %}
<div class="card rounded shadow d-flex align-content-center mt-3 h-full w-100">
<p class="card-header rounded-top fw-bold">{% trans 'Reservations Details' %}</p>
<div class="card-body">
<div class="table-responsive scrollbar mb-3">
<table class="table table-sm fs-9 mb-0 overflow-hidden">
{% if car.is_reserved %}
<thead>
<tr>
<th>{% trans "Reserved By" %}</th>
<th>{% trans "Expires At" %}</th>
<th>{% trans 'Actions' %}</th>
</tr>
</thead>
<tbody>
{% for reservation in car.reservations.all %}
<tr>
<td>{{ reservation.reserved_by.dealer }}</td>
<td>{{ reservation.reserved_until }}</td>
{% if perms.inventory.change_carreservation %}
<td>
{% if reservation.is_active %}
<form method="post"
action="{% url 'reservations' request.dealer.slug reservation.id %}">
{% csrf_token %}
<div class="btn-group">
<button type="submit"
name="action"
value="renew"
class="btn btn-sm btn-phoenix-success px-3 py-1">
{% trans "Renew" %}
</button>
<button type="submit"
name="action"
value="cancel"
class="btn btn-sm btn-phoenix-secondary px-3 py-1">
{% trans "Cancel" %}
</button>
</div>
</form>
{% else %}
<span class="badge badge-phoenix badge-phoenix-danger fs-10">{% trans "Expired" %}</span>
{% endif %}
</td>
{% endif %}
</tr>
{% endfor %}
{% else %}
{% if perms.inventory.add_carreservation %}
<tr>
<td>
<button type="button"
class="btn btn-sm btn-phoenix-success"
data-bs-toggle="modal"
data-bs-target="#reserveModal">
{% trans 'Reserve' %}
</button>
</td>
</tr>
{% endif %}
</tbody>
{% endif %}
</table>
</div>
</div>
</div>
{% endif %}
{% endif %}
<!-- Transfer Table -->
{% if car.status == 'transfer' and car.get_transfer %}
<div class="card rounded shadow d-flex align-content-center mt-3">
<p class="card-header rounded-top fw-bold">{% trans 'Transfer Details' %}</p>
<div class="card-body">
<div class="table-responsive scrollbar mb-3">
<table class="table table-sm fs-9 mb-0 overflow-hidden">
<thead>
<tr>
<th>{% trans "Action" %}</th>
<th>{% trans "Status" %}</th>
<th>{% trans "From Showroom" %}</th>
<th>{% trans "To Showroom" %}</th>
<th>{% trans 'Date' %}</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<span class="badge badge-phoenix badge-phoenix-info">{% trans "Transfer" %}</span>
</td>
<td>
{% if car.get_transfer.status == "draft" %}
<span class="badge badge-phoenix badge-phoenix-warning">{% trans "waiting for approval" %}</span>
{% elif car.get_transfer.status == "approved" %}
<span class="badge badge-phoenix badge-phoenix-info">{% trans "waiting for dealer acceptance" %}</span>
{% endif %}
</td>
<td>{{ car.get_transfer.from_dealer|title }}</td>
<td>{{ car.get_transfer.to_dealer|title }}</td>
<td>{{ car.get_transfer.transfer_date|date:"Y-m-d" }}</td>
<td>
{% if car.get_transfer.status == "draft" %}
<a class="btn btn-sm btn-phoenix-success"
href="{% url 'transfer_detail' car.get_transfer.pk %}">{% trans "Approve" %}</a>
{% endif %}
</td>
<td>
<a class="btn btn-sm btn-phoenix-success"
href="{% url 'transfer_detail' car.get_transfer.pk %}?action=cancel">{% trans "Cancel" %}</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
{% endif %}
</div>
<div class="col-md-6">
<div class="card mb-3 rounded shadow d-flex align-content-center
{% if car.get_transfer %}disabled{% endif %}">
<p class="card-header rounded-top fw-bold">{% trans 'Car Details' %}</p>
<div class="card-body">
@ -234,7 +500,7 @@
{% if not car.get_transfer %}
{% if perms.inventory.change_car %}
<a href="{% url 'car_update' request.dealer.slug car.slug %}"
class="btn btn-phoenix-primary btn-sm mt-1">{% trans "Edit" %}
class="btn btn-phoenix-primary btn-sm mt-1 me-3 mb-3">{% trans "Edit" %}
<span class="fas fa-solid fa-pencil ms-1"></span>
</a>
<a href="{% url 'transfer' car.slug %}"
@ -249,257 +515,10 @@
</div>
</div>
</div>
<div class="col-lg-6 col-xl-6">
{% if perms.inventory.view_carfinance %}
<div class="card rounded shadow d-flex align-content-center
{% if car.get_transfer %}transfer{% endif %}">
<p class="card-header rounded-top fw-bold">{% trans 'Financial Details' %}</p>
<div class="card-body">
<div class="table-responsive scrollbar mb-3">
<table class="table table-sm fs-9 mb-0 overflow-hidden">
{% if car.marked_price %}
<tr>
{% if perms.inventory.view_carfinance %}
<th>{% trans "Cost Price"|capfirst %}</th>
<td>{{ car.cost_price|floatformat:2 }}</td>
{% endif %}
</tr>
<tr>
<th>{% trans "Marked Price"|capfirst %}</th>
<td>{{ car.marked_price|floatformat:2 }}</td>
</tr>
{% comment %} <tr>
<th>{% trans "Selling Price"|capfirst %}</th>
<td>{{ car.finances.selling_price|floatformat:2 }}</td>
</tr>
<tr>
<th>{% trans "Discount Amount"|capfirst %}</th>
<td>{{ car.finances.discount_amount|floatformat:2 }}</td>
</tr>
<tr>
<th>{% trans "Additional Fee"|capfirst %}</th>
<td></td>
</tr>
{% if car.finances.additional_services.first.pk %}
{% for service in car.finances.additional_services.all %}
<tr>
<td>{{ service.name }}</td>
<td>{{ service.price_|floatformat:2 }}</td>
</tr>
{% endfor %}
{% endif %}
<tr>
<th>{% trans "VAT Amount"|capfirst %}</th>
<td>{{ car.finances.vat_amount|floatformat:2 }}</td>
</tr>
<tr>
<th>{% trans "Total"|capfirst %}</th>
<td>{{ car.finances.total_vat|floatformat:2 }}</td>
</tr> {% endcomment %}
{% if perms.inventory.change_carfinance %}
<tr>
<td colspan="2">
{% if not car.get_transfer %}
<a href="{% url 'car_finance_update' request.dealer.slug car.slug %}"
class="btn btn-phoenix-warning btn-sm mb-3">{% trans "Edit" %}</a>
{% else %}
<span class="badge bg-danger">{% trans "Cannot Edit, Car in Transfer." %}</span>
{% endif %}
</td>
</tr>
{% endif %}
{% else %}
<p>{% trans "No finance details available." %}</p>
{% if perms.inventory.add_carfinance %}
<a href="{% url 'car_finance_update' request.dealer.slug car.slug %}"
class="btn btn-phoenix-success btn-sm mb-3">{% trans "Add" %}</a>
{% endif %}
{% endif %}
</table>
</div>
</div>
</div>
{% endif %}
{% if perms.inventory.view_carcolors %}
<div class="card rounded shadow d-flex align-content-center mt-3
{% if car.get_transfer %}transfer{% endif %}">
<p class="card-header rounded-top fw-bold">{% trans 'Colors Details' %}</p>
<div class="card-body">
<div class="table-responsive scrollbar mb-3">
<table class="table table-sm fs-9 mb-0 overflow-hidden">
<!--test-->
{% if car.colors %}
<tr>
<th>{% trans 'Exterior' %}</th>
<td>
<span>{{ car.colors.exterior.get_local_name }}</span>
</td>
<td class="align-middle">
<div class="text-end color-div"
style="background-color: rgb({{ car.colors.exterior.rgb }})">
</div>
</td>
</tr>
<tr>
<th>{% trans 'Interior' %}</th>
<td>
<span>{{ car.colors.interior.get_local_name }}</span>
</td>
<td class="align-middle">
<div class="text-end color-div"
style="background-color: rgb({{ car.colors.interior.rgb }})">
</div>
</td>
</tr>
{% if perms.inventory.change_carcolors %}
<tr>
<td colspan="2">
{% if not car.get_transfer %}
<a href="{% url 'car_colors_update' request.dealer.slug car.slug %}"
class="btn btn-phoenix-warning btn-sm mb-3">{% trans "Edit" %}</a>
{% else %}
<span class="badge bg-danger">{% trans "Cannot Edit, Car in Transfer." %}</span>
{% endif %}
</td>
</tr>
{% endif %}
{% else %}
<tr>
<td colspan="2">
<p>{% trans "No color details available." %}</p>
{% if perms.inventory.add_carcolors %}
<a class="btn btn-phoenix-success btn-sm mb-3"
href="{% url 'add_color' request.dealer.slug car.slug %}">{{ _("Add Color") }}</a>
{% endif %}
</td>
</tr>
{% endif %}
<!--test-->
</table>
</div>
</div>
</div>
{% endif %}
{% if car.status != 'transfer' %}
{% if perms.inventory.view_carreservation %}
<div class="card rounded shadow d-flex align-content-center mt-3">
<p class="card-header rounded-top fw-bold">{% trans 'Reservations Details' %}</p>
<div class="card-body">
<div class="table-responsive scrollbar mb-3">
<table class="table table-sm fs-9 mb-0 overflow-hidden">
{% if car.is_reserved %}
<thead>
<tr>
<th>{% trans "Reserved By" %}</th>
<th>{% trans "Expires At" %}</th>
<th>{% trans 'Actions' %}</th>
</tr>
</thead>
<tbody>
{% for reservation in car.reservations.all %}
<tr>
<td>{{ reservation.reserved_by.dealer }}</td>
<td>{{ reservation.reserved_until }}</td>
{% if perms.inventory.change_carreservation %}
<td>
{% if reservation.is_active %}
<form method="post"
action="{% url 'reservations' request.dealer.slug reservation.id %}">
{% csrf_token %}
<div class="btn-group">
<button type="submit"
name="action"
value="renew"
class="btn btn-sm btn-phoenix-success px-3 py-1">
{% trans "Renew" %}
</button>
<button type="submit"
name="action"
value="cancel"
class="btn btn-sm btn-phoenix-secondary px-3 py-1">
{% trans "Cancel" %}
</button>
</div>
</form>
{% else %}
<span class="badge badge-phoenix badge-phoenix-danger fs-10">{% trans "Expired" %}</span>
{% endif %}
</td>
{% endif %}
</tr>
{% endfor %}
{% else %}
{% if perms.inventory.add_carreservation %}
<tr>
<td>
<button type="button"
class="btn btn-sm btn-phoenix-success"
data-bs-toggle="modal"
data-bs-target="#reserveModal">
{% trans 'Reserve' %}
</button>
</td>
</tr>
{% endif %}
</tbody>
{% endif %}
</table>
</div>
</div>
</div>
{% endif %}
{% endif %}
<!-- Transfer Table -->
{% if car.status == 'transfer' and car.get_transfer %}
<div class="card rounded shadow d-flex align-content-center mt-3">
<p class="card-header rounded-top fw-bold">{% trans 'Transfer Details' %}</p>
<div class="card-body">
<div class="table-responsive scrollbar mb-3">
<table class="table table-sm fs-9 mb-0 overflow-hidden">
<thead>
<tr>
<th>{% trans "Action" %}</th>
<th>{% trans "Status" %}</th>
<th>{% trans "From Showroom" %}</th>
<th>{% trans "To Showroom" %}</th>
<th>{% trans 'Date' %}</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<span class="badge badge-phoenix badge-phoenix-info">Transfer</span>
</td>
<td>
{% if car.get_transfer.status == "draft" %}
<span class="badge badge-phoenix badge-phoenix-warning">waiting for approval</span>
{% elif car.get_transfer.status == "approved" %}
<span class="badge badge-phoenix badge-phoenix-info">waiting for dealer acceptance</span>
{% endif %}
</td>
<td>{{ car.get_transfer.from_dealer|title }}</td>
<td>{{ car.get_transfer.to_dealer|title }}</td>
<td>{{ car.get_transfer.transfer_date|date:"Y-m-d" }}</td>
<td>
{% if car.get_transfer.status == "draft" %}
<a class="btn btn-sm btn-phoenix-success"
href="{% url 'transfer_detail' car.get_transfer.pk %}">Approve</a>
{% endif %}
</td>
<td>
<a class="btn btn-sm btn-phoenix-success"
href="{% url 'transfer_detail' car.get_transfer.pk %}?action=cancel">Cancel</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
{% endif %}
</div>
</div>
{% if car.status == 'sold' %}
<img class="car_status"
src="{% static 'images/sold.png' %}"
@ -508,6 +527,7 @@
alt="">
{% endif %}
</div>
<!-- Custom Card Modal -->
<div class="modal fade"
id="customCardModal"

View File

@ -6,34 +6,34 @@
{% trans 'Edit Car' %}
{% endblock %}
{% block content %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% trans 'Edit Car' %}
<span class="fas fa-solid fa-car text-primary ms-2"></span>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% trans 'Edit Car' %}
<i class="fas fa-solid fa-car ms-2"></i>
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" class="needs-validation" novalidate>
{% csrf_token %} {{ form|crispy }}
<!-- Save and Back Buttons -->
<hr class="my-2">
<div class="card-body p-4 p-md-5">
<form method="post" class="needs-validation" novalidate>
{% csrf_token %}
{{ form|crispy }}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'car_detail' request.dealer.slug car.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'car_detail' request.dealer.slug car.slug %}"
class="btn btn-phoenix-danger btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock %}
</main>
{% endblock %}

View File

@ -1,50 +1,54 @@
{% extends 'base.html' %}
{% load crispy_forms_filters %}
{% extends "base.html" %}
{% load i18n %}
{% load crispy_forms_filters %}
{% load custom_filters %}
{% block title %}
{% trans "Car Finance Details" %}
{% endblock %}
{% block content %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% trans "Finance Details for" %}<span class="fas fa-solid fa-car text-primary ms-2"></span>&nbsp;{{ car.id_car_make.get_local_name }} - {{ car.id_car_model.get_local_name }}
</h3>
{% if form.errors %}
<div class="alert alert-danger">
<ul>
{% for field in form %}
{% for error in field.errors %}<li>{{ field.label }}: {{ error }}</li>{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}<li>{{ error }}</li>{% endfor %}
</ul>
</div>
{% endif %}
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-md-8">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% trans "Finance Details for" %}
<span class="text-gray-300">{{car.id_car_make.name}}&nbsp;{{car.id_car_model.name}}&nbsp;{{car.id_car_serie.serie}}&nbsp;{{car.year}}</span>
<i class="fas fa-solid fa-car ms-2"></i>
</h3>
<p class="text-center mt-1">VIN:&nbsp;&nbsp;{{car.vin}}</p>
</div>
<div class="card-body bg-light-subtle">
<div class="card-body p-4 p-md-5">
{% if form.errors %}
<div class="alert alert-danger mt-4" role="alert">
<h4 class="alert-heading small">{% trans "Please correct the following errors:" %}</h4>
<ul class="mb-0">
{% for field, errors in form.errors.items %}
<li><strong>{{ field|capfirst }}:</strong> {% for error in errors %}{{ error }}{% endfor %}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<form method="post" class="needs-validation" novalidate>
<div class="row g-1">
<div class="col-lg-4 col-xl-12">
{% csrf_token %}
{{ form|crispy }}
</div>
</div>
<hr class="my-2">
<div class="row g-1">
<div class="col-lg-4 col-xl-12">
{% csrf_token %}
{{ form|crispy }}
</div>
</div>
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'car_detail' request.dealer.slug car.slug %}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'car_detail' request.dealer.slug car.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
<!-- JavaScript Section -->
{% endblock %}
</main>
{% endblock %}

View File

@ -24,7 +24,6 @@
</style>
{% endblock customCSS %}
{% block content %}
{% if cars or request.GET.q%}
<div class="container-fluid" id="projectSummary">
<div class="row g-3 justify-content-between align-items-end mb-4">
@ -269,11 +268,11 @@
<div class="dropdown-menu dropdown-menu-end py-2">
<a class="dropdown-item"
href="{% url 'car_detail' request.dealer.slug car.slug %}"> <span class="fas fa-eye me-2"></span>{{ _("View") }} </a>
{% if perms.inventory.change_car %}
{% if perms.inventory.change_car and not car.status == 'sold' %}
<a class="dropdown-item"
href="{% url 'car_update' request.dealer.slug car.slug %}"> <span class="fas fa-edit me-2"></span>{{ _("Edit") }} </a>
{% endif %}
{% if perms.inventory.delete_car %}
{% if perms.inventory.delete_car and not car.status == 'sold' %}
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger"
href="{% url 'car_delete' request.dealer.slug car.slug %}"> <span class="fas fa-trash me-2"></span>{{ _("Remove") }} </a>

View File

@ -6,31 +6,35 @@
{{ _("Add New Expense") }}
{% endblock title %}
{% block content %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{{ _("Add Expense") }}
<span class="fas fa-money-bill-wave ms-2 text-primary"></span>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-md-6">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{{ _("Add Expense") }}
<i class="fas fa-money-bill-wave ms-2"></i>
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" action="">
{% csrf_token %}
{{ form|crispy }}
<div class="card-body p-4 p-md-5">
<form method="post" action="" class="needs-validation" novalidate>
{% csrf_token %}
{{ form|crispy }}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'item_expense_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'item_expense_list' request.dealer.slug %}"
class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock content %}
</main>
{% endblock content %}

View File

@ -6,48 +6,34 @@
{{ _("Update Expense") }}
{% endblock title %}
{% block content %}
{% comment %} <div class="row">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ _("Update Expense") }}</div>
<div class="card-body">
<form method="post" action="">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-phoenix-primary">{% trans 'Save' %}</button>
</form>
</div>
</div>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-md-6">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{{ _("Update Expense") }}
<i class="fas fa-money-bill-wave ms-2"></i>
</h3>
</div>
</div>
</div> {% endcomment %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{{ _("Update Expense") }}
<span class="fas fa-money-bill-wave ms-2 text-primary"></span>
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" action="">
{% csrf_token %}
{{ form|crispy }}
<hr class="my-2">
<div class="card-body p-4 p-md-5">
<form method="post" action="" class="needs-validation" novalidate>
{% csrf_token %}
{{ form|crispy }}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'item_expense_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'item_expense_list' request.dealer.slug %}"
class="btn btn-phoenix-danger btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock content %}
</main>
{% endblock content %}

View File

@ -3,7 +3,7 @@
{% load static %}
{% load i18n %}
{% block title %}
{# Check if an 'object' exists in the context #}
{# Check if an 'object' exists in the context #}
{% if object %}
{% trans 'Update Service' %}
{% else %}
@ -11,39 +11,50 @@
{% endif %}
{% endblock %}
{% block content %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% if service.pk %}
{{ _("Update Service") }}
{% else %}
{{ _("Add Service") }}
{% endif %}
<span class="fas fa-tools ms-2 text-primary"></span>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-100 py-5">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% if object %}
{% trans "Update Service" %}
<i class="fas fa-tools ms-2"></i>
{% else %}
{% trans "Add New Service" %}
<i class="fas fa-tools ms-2"></i>
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<div class="card-body p-4 p-md-5">
<form method="post" action="" class="needs-validation" novalidate>
{% csrf_token %}
{{ form|crispy }}
{% if form.errors %}
<div class="alert alert-danger mt-4" role="alert">
<h4 class="alert-heading small">{% trans "Please correct the following errors:" %}</h4>
<ul class="mb-0">
{% for field, errors in form.errors.items %}
<li><strong>{{ field|capfirst }}:</strong> {% for error in errors %}{{ error }}{% endfor %}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<form method="post" action="">
{% csrf_token %}
{{ form|crispy }}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'item_service_list' request.dealer.slug%}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'item_service_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock content %}
</main>
{% endblock content %}

View File

@ -2,7 +2,7 @@
{% load i18n %}
{% load crispy_forms_filters %}
{% block title %}
{# Check if an 'object' exists in the context #}
{# Check if an 'object' exists in the context #}
{% if object %}
{% trans 'Update Bank Account' %}
{% else %}
@ -10,41 +10,50 @@
{% endif %}
{% endblock %}
{% block content %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% if customer.created %}
{{ _("Edit Bank Account") }}
{% else %}
{{ _("Add Bank Account") }}
{% endif %}
<span class="fas fa-bank ms-2 text-primary"></span>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-100 py-5 ">
<div class="col-md-8">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% if object %}
{% trans "Update Bank Account" %}
<i class="fa-solid fa-bank ms-2"></i>
{% else %}
{% trans "Add New Bank Account" %}
<i class="fa-solid fa-bank ms-2"></i>
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" class="form" novalidate>
{% csrf_token %}
{{ form|crispy }}
{% for error in form.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'bank_account_list' request.dealer.slug%}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
</form>
<div class="card-body p-4 p-md-5">
<form method="post" class="needs-validation" novalidate>
{% csrf_token %}
{{ form|crispy }}
{% if form.errors %}
<div class="alert alert-danger mt-4" role="alert">
<h4 class="alert-heading small">{% trans "Please correct the following errors:" %}</h4>
<ul class="mb-0">
{% for field, errors in form.errors.items %}
<li><strong>{{ field|capfirst }}:</strong> {% for error in errors %}{{ error }}{% endfor %}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{% trans "Save" %}
</button>
<a href="{% url 'bank_account_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock %}
</main>
{% endblock %}

View File

@ -5,42 +5,36 @@
{{ _("Create Journal Entry") }}
{% endblock title %}
{% block content %}
{% comment %} <div class="row mt-4">
<h3 class="text-center">{% trans "Create Journal Entry" %}</h3>
<form id="mainForm" method="post" class="needs-validation">
{% csrf_token %}
<div class="row g-3">
{{ form|crispy }}
<main class="d-flex align-items-center justify-content-center min-vh-100 py-5">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% trans "Create Journal Entry" %}
<i class="fas fa-book-open ms-2"></i>
</h3>
</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' 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> {% endcomment %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center text-white">{% trans "Create Journal Entry" %}</h3>
</div>
<div class="card-body bg-light-subtle">
<form id="mainForm" method="post" class="needs-validation">
{% csrf_token %}
<div class="row g-3">{{ form|crispy }}</div>
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
</button>
<a href="{% url 'journalentry_list' request.dealer.slug ledger.pk %}"
class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i> {% trans "Cancel" %}</a>
</div>
</form>
</div>
<div class="card-body p-4 p-md-5">
<form id="mainForm" method="post" class="needs-validation" novalidate>
{% csrf_token %}
<div class="row g-3">
{{ form|crispy }}
</div>
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'journalentry_list' request.dealer.slug ledger.pk %}"
class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock content %}
</main>
{% endblock content %}

View File

@ -5,38 +5,36 @@
{{ _("Create Ledger") }}
{% endblock title %}
{% block content %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% trans "Create Ledger" %}
<span class="fas fa-book-open ms-2 text-primary"></span>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-100 py-5 ">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% trans "Create Ledger" %}
<i class="fas fa-book-open ms-2"></i>
</h3>
</div>
<div class="card-body bg-light-subtle">
<form id="mainForm" method="post" class="needs-validation">
<div class="card-body p-4 p-md-5">
<form id="mainForm" method="post" class="needs-validation" novalidate>
{% csrf_token %}
<div class="row g-3">
{{ form|crispy }}
</div>
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'ledger_list' request.dealer.slug request.entity.slug %}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
<div class="row g-3">
{{ form|crispy }}
</div>
</form>
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'ledger_list' request.dealer.slug request.entity.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock content %}
</main>
{% endblock content %}

View File

@ -4,37 +4,69 @@
{% trans "Organization Details" %}
{% endblock title %}
{% block content %}
<div class="row my-4">
<h2 class="mb-2">{{ organization.get_local_name }}</h2>
<ul class="list-group mb-4">
<li class="list-group-item">
<strong>{% trans "CRN" %}:</strong> {{ organization.crn }}
</li>
<li class="list-group-item">
<strong>{% trans "VRN" %}:</strong> {{ organization.vrn }}
</li>
<li class="list-group-item">
<strong>{% trans "Phone" %}:</strong> {{ organization.phone_number }}
</li>
<li class="list-group-item">
<strong>{% trans "Address" %}:</strong> {{ organization.address }}
</li>
</ul>
<div class="d-flex">
{% if perms.inventory.change_organization %}
<a href="{% url 'organization_update' request.dealer.slug organization.slug %}"
class="btn btn-sm btn-phoenix-primary me-2"><span class="fas fa-edit me-1"></span>{% trans "Edit" %}</a>
{% endif %}
{% if perms.inventory.delete_organization %}
<button class="btn btn-phoenix-danger btn-sm delete-btn"
data-url="{% url 'organization_delete' request.dealer.slug organization.slug %}"
data-message="Are you sure you want to delete this organization?"
data-bs-toggle="modal"
data-bs-target="#deleteModal">
<i class="fas fa-trash me-1"></i> {% trans 'Delete' %}
</button>
{% endif %}
<main class="py-5 min-vh-80 d-flex justify-content-center align-items-center">
<div class="container py-4">
<div class="row justify-content-center">
<div class="col-12 col-lg-8 col-xl-6">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h2 class="card-title mb-0 fs-3 fw-bold text-center">
<i class="fas fa-building me-2"></i>
{{ organization.get_local_name }}
</h2>
</div>
<div class="card-body p-4 p-md-5">
<ul class="list-group list-group-flush rounded-3 border">
<li class="list-group-item d-flex justify-content-between align-items-center p-3">
<div class=" fw-semibold">
<i class="fas fa-id-card-alt me-2 text-primary"></i>
{% trans "CRN" %}:
</div>
<span class="">{{ organization.crn }}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center p-3">
<div class=" fw-semibold">
<i class="fas fa-receipt me-2 text-primary"></i>
{% trans "VRN" %}:
</div>
<span class="">{{ organization.vrn }}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center p-3">
<div class="fw-semibold">
<i class="fas fa-phone-alt me-2 text-primary"></i>
{% trans "Phone" %}:
</div>
<span class="">{{ organization.phone_number }}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center p-3">
<div class="fw-semibold">
<i class="fas fa-map-marker-alt me-2 text-primary"></i>
{% trans "Address" %}:
</div>
<span class=" text-end ms-3">{{ organization.address }}</span>
</li>
</ul>
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center mt-4 pt-2">
{% if perms.inventory.change_organization %}
<a href="{% url 'organization_update' request.dealer.slug organization.slug %}"
class="btn btn-phoenix-primary btn-lg flex-grow-1"><i class="fas fa-edit me-2"></i>{% trans "Edit Details" %}</a>
{% endif %}
{% if perms.inventory.delete_organization %}
<button class="btn btn-phoenix-danger btn-lg delete-btn flex-grow-1"
data-url="{% url 'organization_delete' request.dealer.slug organization.slug %}"
data-message="Are you sure you want to delete this organization?"
data-bs-toggle="modal"
data-bs-target="#deleteModal">
<i class="fas fa-trash me-2"></i>{% trans 'Delete' %}
</button>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
{% include 'modal/delete_modal.html' %}
{% endblock %}
</main>
{% include 'modal/delete_modal.html' %}
{% endblock %}

View File

@ -1,44 +1,61 @@
{% extends 'base.html' %}
{% extends "base.html" %}
{% load i18n %}
{% load crispy_forms_filters %}
{% block title %}
{# Check if an 'object' exists in the context #}
{% if object %}
{% trans 'Update Organization' %}
{% else %}
{% trans 'Add New Organization' %}
{% endif %}
{% endblock %}
{% block content %}
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% if object %}
{% trans 'Update Organization'%}
{% else %}
{% trans 'Add New Organization'%}
{% endif %}
<span class=" fas fa-solid fa-city ms-2 text-primary"></span>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-100 py-5">
<div class="col-md-8">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% if object %}
{% trans 'Update Organization' %}
<i class="fa-solid fa-edit ms-2"></i>
{% else %}
{% trans 'Add New Organization' %}
<i class="fa-solid fa-building ms-2"></i>
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="form" method="post" enctype="multipart/form-data">
<div class="card-body p-4 p-md-5">
<form class="form" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ redirect_field }}
{{ form|crispy }}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'organization_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
{% if form.errors %}
<div class="alert alert-danger mt-4" role="alert">
<h4 class="alert-heading small">{% trans "Please correct the following errors:" %}</h4>
<ul class="mb-0">
{% for field, errors in form.errors.items %}
<li><strong>{{ field|capfirst }}:</strong> {% for error in errors %}{{ error }}{% endfor %}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{% trans "Save" %}
</button>
<a href="{% url 'organization_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
{% endblock %}
</main>
{% endblock %}

View File

@ -1,60 +1,39 @@
{% extends 'base.html' %}
{% load i18n crispy_forms_filters %}
{% block title %}
{% trans 'Billing Information' %}{% endblock %}
{% block content %}
{% comment %} <div class="row mb-3">
<div class="col-sm-6">
<form action="{% url 'billing_info' %}{% if request.GET.next %}?next={{ request.GET.next }}{% endif %}" method="post" class="form">
<h3>{% trans "Provide billing data"|upper %}</h3>
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-sm btn-phoenix-success me-2">
<i class="fa fa-save me-1"></i>{{ _("Save") }}
</button>
{% if object %}
<a class="btn btn-sm btn-phoenix-danger " href="{% url 'billing_info_delete' %}"><i class="fa-solid fa-trash me-1"></i> {{ _("Delete") }}</a>
{% endif %}
</form>
</div>
</div> {% endcomment %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% trans "Provide billing data"|upper %}<span class="fas fa-file-invoice-dollar ms-2 text-primary"></span>
</h3>
{% trans 'Billing Information' %}
{% endblock %}
{% block content %}
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-md-8">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% trans "Provide billing data"|upper %}
<i class="fas fa-file-invoice-dollar ms-2"></i>
</h3>
</div>
<div class="card-body bg-light-subtle">
<form action="{% url 'billing_info' %}{% if request.GET.next %}?next={{ request.GET.next }}{% endif %}" method="post" class="form">
{% csrf_token %}
{{ form|crispy }}
<hr class="my-2">
<div class="card-body p-4 p-md-5">
<form action="{% url 'billing_info' %}{% if request.GET.next %}?next={{ request.GET.next }}{% endif %}"
method="post" class="needs-validation" novalidate>
{% csrf_token %}
{{ form|crispy }}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
{% if object %}
<a class="btn btn-lg btn-phoenix-danger" href="{% url 'billing_info_delete' %}"><i class="fa-solid fa-trash me-1"></i> {{ _("Delete") }}</a>
{% endif %}
</div>
</form>
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
{% if object %}
<a class="btn btn-phoenix-danger btn-lg" href="{% url 'billing_info_delete' %}">
<i class="fa-solid fa-trash me-1"></i>
{{ _("Delete") }}
</a>
{% endif %}
</div>
</form>
</div>
</div>
<!---->
{% endblock %}
</div>
</main>
{% endblock %}

View File

@ -121,7 +121,7 @@
width: 0;
}
</style>
<div class="row justify-content-center mt-5 mb-3">
<div class="row d-flex justify-content-center align-items-center mt-5 mb-3 ms-6 ps-3" >
<div class="row">
<div class="col">
{% if not items %}
@ -137,19 +137,19 @@
{% endif %}
</div>
<div>
<div class="col-lg-12 col-md-10 needs-validation {% if not items or not customer_count %}d-none{% endif %}">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<div class="col-md-10 ms-4 needs-validation {% if not items or not customer_count %}d-none{% endif %}">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 text-center">
{% trans "Create Quotation" %}<i class="fa-regular fa-file-lines text-primary ms-2"></i>
{% trans "Create Quotation" %}<i class="fa-regular fa-file-lines ms-2"></i>
</h3>
</div>
<div class="card-body bg-light-subtle">
<div class="card-body p-4 p-md-5">
<form id="mainForm" method="post" class="needs-validation {% if not items and not customer_count %}d-none{% endif %}">
{% csrf_token %}
<div class="row g-3 col-12">
<div class="row g-3">
{{ form|crispy }}
<div class="custom-select">
<!-- Hidden native select for form submission -->

View File

@ -6,20 +6,33 @@
{{ _("Sale Order") }}
{% endblock title %}
{% block content %}
<div class="row">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ _("Sale Order") }}</div>
<div class="card-body">
<form method="post" action="{% url 'create_sale_order' request.dealer.slug estimate.pk %}">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-phoenix-primary">{% trans 'Save' %}</button>
</form>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{{ _("Create Sale Order") }}
<i class="fas fa-file-invoice-dollar ms-2"></i>
</h3>
</div>
<div class="card-body p-4 p-md-5">
<form method="post" action="{% url 'create_sale_order' request.dealer.slug estimate.pk %}" class="needs-validation" novalidate>
{% csrf_token %}
{{ form|crispy }}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{% trans 'Save' %}
</button>
<a href="{% url 'home' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</div>
</form>
</div>
</div>
</div>
</main>
{% endblock content %}

View File

@ -6,30 +6,34 @@
{{ _("Invoice") }}
{% endblock title %}
{% block content %}
<div class="row paid justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{{ _("Add Invoice") }}<i class="fa-solid fa-receipt ms-2 text-primary"></i>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{{ _("Add Invoice") }}
<i class="fa-solid fa-receipt ms-2"></i>
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" action="">
{% csrf_token %}
{{ form|crispy }}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'invoice_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
</form>
</div>
<div class="card-body p-4 p-md-5">
<form method="post" action="" class="needs-validation" novalidate>
{% csrf_token %}
{{ form|crispy }}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'invoice_list' request.dealer.slug %}"
class="btn btn-phoenix-danger btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock content %}
</main>
{% endblock content %}

View File

@ -4,18 +4,33 @@
{% load i18n %}
{% block content %}
<div class="card">
<div class="card-header bg-primary text-white">
<h2 class="h4 mb-0">Create Support Ticket</h2>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% trans "Create Support Ticket" %}
<i class="fa-solid fa-headset ms-2"></i>
</h3>
</div>
<div class="card-body p-4 p-md-5">
<form method="post" class="needs-validation" novalidate>
{% csrf_token %}
{{ form|crispy }}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button type="submit" class="btn btn-phoenix-primary btn-lg me-md-2">
<i class="fa-solid fa-paper-plane me-1"></i>
{% trans "Submit Ticket" %}
</button>
<a href="{% url 'ticket_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<div class="card-body">
<form method="post">
{% csrf_token %}
{{form|crispy}}
<button type="submit" class="btn btn-primary">Submit Ticket</button>
<a href="{% url 'ticket_list' request.dealer.slug %}" class="btn btn-secondary">Cancel</a>
</form>
</div>
</div>
{% endblock %}
</main>
{% endblock %}

View File

@ -2,59 +2,76 @@
{% load static %}
{% load crispy_forms_tags %}
{% load i18n %}
{% block title %}
{% trans 'Ticket' %} #{{ ticket.id }}
{% endblock title %}
{% block content %}
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h2 class="h4 mb-0">Ticket #{{ ticket.id }}: {{ ticket.subject }}</h2>
<div>
<a href="{% url 'ticket_list' request.dealer.slug %}" class="btn btn-sm btn-outline-secondary">
Back to List
</a>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5 ">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% trans 'Ticket' %} #{{ ticket.id }}
<i class="fas fa-headset ms-2"></i>
</h3>
</div>
<div class="card-body p-4 p-md-5">
<div class="row g-3">
<div class="col-12 text-center mb-3">
<h4 class="h5 fw-bold">{{ ticket.subject }}</h4>
</div>
<div class="col-sm-6">
<strong>{% trans 'Status:' %}</strong>
<span class="badge
{% if ticket.status == 'open' %}bg-primary
{% elif ticket.status == 'in_progress' %}bg-info
{% elif ticket.status == 'resolved' %}bg-success
{% else %}bg-secondary{% endif %}">
{{ ticket.get_status_display }}
</span>
</div>
<div class="col-sm-6 text-sm-end">
<strong>{% trans 'Priority:' %}</strong>
<span class="badge
{% if ticket.priority == 'low' %}bg-success
{% elif ticket.priority == 'medium' %}bg-warning
{% elif ticket.priority == 'high' %}bg-danger
{% else %}bg-dark{% endif %}">
{{ ticket.get_priority_display }}
</span>
</div>
<div class="col-sm-6">
<strong>{% trans 'Created:' %}</strong>
<br class="d-sm-none">{{ ticket.created_at|date:"M d, Y" }}
</div>
<div class="col-sm-6 text-sm-end">
<strong>{% trans 'Last Updated:' %}</strong>
<br class="d-sm-none">{{ ticket.updated_at|date:"M d, Y" }}
</div>
</div>
<hr class="my-4">
<div class="mb-4">
<h5 class="fw-bold mb-2">{% trans 'Description' %}</h5>
<div class="p-3 bg-light rounded-3">
{{ ticket.description|linebreaks }}
</div>
</div>
{% if ticket.resolution_notes %}
<div class="mb-4">
<h5 class="fw-bold mb-2">{% trans 'Resolution Notes' %}</h5>
<div class="p-3 bg-light rounded-3">
{{ ticket.resolution_notes|linebreaks }}
</div>
</div>
{% endif %}
<div class="d-grid mt-4">
<a href="{% url 'ticket_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-arrow-left me-1"></i>
{% trans 'Back to Tickets' %}
</a>
</div>
</div>
</div>
</div>
<div class="card-body">
<div class="row mb-4">
<div class="col-md-6">
<p><strong>Status:</strong>
<span class="badge
{% if ticket.status == 'open' %}bg-primary
{% elif ticket.status == 'in_progress' %}bg-info
{% elif ticket.status == 'resolved' %}bg-success
{% else %}bg-secondary{% endif %}">
{{ ticket.get_status_display }}
</span>
</p>
<p><strong>Priority:</strong>
<span class="badge
{% if ticket.priority == 'low' %}bg-success
{% elif ticket.priority == 'medium' %}bg-warning
{% elif ticket.priority == 'high' %}bg-danger
{% else %}bg-dark{% endif %}">
{{ ticket.get_priority_display }}
</span>
</p>
</div>
<div class="col-md-6">
<p><strong>Created:</strong> {{ ticket.created_at|date:"M d, Y H:i" }}</p>
<p><strong>Last Updated:</strong> {{ ticket.updated_at|date:"M d, Y H:i" }}</p>
</div>
</div>
<div class="mb-4">
<h3 class="h5">Description</h3>
<div class="p-3 rounded">
{{ ticket.description|linebreaks }}
</div>
</div>
<div class="mb-4">
<h3 class="h5">Resolution Notes</h3>
<div class="p-3 rounded">
{{ ticket.resolution_notes|linebreaks }}
</div>
</div>
<!-- You can add comments/replies section here later -->
</div>
</div>
</main>
{% endblock %}

View File

@ -1,131 +1,116 @@
{% extends "base.html" %}
{% load static %}
{% load i18n %}
{% block title %}
{% trans "My Tickets" %}
{% endblock title %}
{% block content %}
<div class="row g-4 mb-5">
<div class="col-12 col-lg-8">
<div class="card h-100">
<div class="card-body d-flex flex-column justify-content-center p-5 text-center">
<h2 class="card-title fw-bold text-primary">Need Help? We're Here for You.</h2>
<p class="card-text text-muted mb-4">
Our support team is ready to assist you with any questions or issues.
Raise a new ticket, and we'll get back to you as soon as possible.
</p>
<a href="{% url 'create_ticket' request.dealer.slug %}" class="btn btn-phoenix-primary btn-lg shadow-sm w-50 mx-auto">
Raise a New Ticket
</a>
<main class="py-5">
<div class="container">
<div class="row justify-content-center mb-5">
<div class="col-lg-8">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInDown">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4 text-center">
<i class="fa-solid fa-headset fa-2x mb-2"></i>
<h2 class="card-title fw-bold mb-0">
{% trans "Need Help?" %}
</h2>
</div>
<div class="card-body p-4 p-md-5 text-center bg-white">
<p class="card-text text-muted mb-4">
{% blocktrans %}
Our support team is ready to assist you. Raise a new ticket below, and we'll get back to you as soon as possible.
{% endblocktrans %}
</p>
<a href="{% url 'create_ticket' request.dealer.slug %}" class="btn btn-phoenix-primary btn-lg shadow-sm">
<i class="fa-solid fa-plus me-1"></i>
{% trans "Raise a New Ticket" %}
</a>
</div>
</div>
</div>
</div>
{% if messages %}
<div class="alert-container mb-4">
{% for message in messages %}
<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endfor %}
</div>
{% endif %}
<div class="card shadow-lg border-0 rounded-4 animate__animated animate__fadeInUp">
<div class="card-header border-bottom d-flex flex-column flex-md-row justify-content-between align-items-md-center p-4">
<h5 class="card-title mb-2 mb-md-0 me-md-4 fw-bold">{% trans "My Tickets" %}</h5>
<div class="input-group w-100 w-md-50">
{% include 'partials/search_box.html' %}
</div>
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-striped table-hover mb-0">
<thead class="bg-light">
<tr>
<th scope="col" class="text-secondary text-uppercase fw-bold ps-4">ID</th>
<th scope="col" class="text-secondary text-uppercase fw-bold">Subject</th>
<th scope="col" class="text-secondary text-uppercase fw-bold">Status</th>
<th scope="col" class="text-secondary text-uppercase fw-bold">Priority</th>
<th scope="col" class="text-secondary text-uppercase fw-bold">Created</th>
<th scope="col" class="text-secondary text-uppercase fw-bold text-end pe-4">Actions</th>
</tr>
</thead>
<tbody>
{% for ticket in tickets %}
<tr>
<td class="text-muted ps-4">#{{ ticket.id }}</td>
<td>{{ ticket.subject }}</td>
<td>
<span class="badge
{% if ticket.status == 'open' %}bg-primary
{% elif ticket.status == 'in_progress' %}bg-info
{% elif ticket.status == 'resolved' %}bg-success
{% else %}bg-secondary{% endif %}">
{{ ticket.get_status_display }}
</span>
</td>
<td>
<span class="badge
{% if ticket.priority == 'low' %}bg-success
{% elif ticket.priority == 'medium' %}bg-warning
{% elif ticket.priority == 'high' %}bg-danger
{% else %}bg-dark{% endif %}">
{{ ticket.get_priority_display }}
</span>
</td>
<td>
<span class="d-block">{{ ticket.created_at|date:"M d, Y" }}</span>
<span class="text-muted small d-block">{{ ticket.created_at|time:"H:i" }}</span>
</td>
<td class="text-end pe-4">
<a href="{% url 'ticket_detail' request.dealer.slug ticket.id %}" class="btn btn-phoenix-primary btn-sm">
<i class="fa-solid fa-eye me-1"></i>
{% trans "View" %}
</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="6" class="text-center text-muted py-5">
<i class="fas fa-ticket-alt fs-2 mb-3"></i>
<p class="mb-0">{% trans "No tickets found." %}</p>
<p class="text-muted small">{% trans "All your past and present tickets will appear here." %}</p>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-12 col-lg-4">
<div class="card h-100">
<div class="card-body p-4">
<h5 class="card-title fw-bold">Quick Links</h5>
<p class="card-text text-muted">Explore common resources to find answers quickly.</p>
<ul class="list-unstyled mb-0">
<li class="mb-3">
<a href="#" class="d-flex align-items-center text-decoration-none">
<span class="fs-4 text-secondary me-2"><i class="fas fa-search"></i></span>
<span class="text-dark">Search our knowledge base</span>
</a>
</li>
<li class="mb-3">
<a href="#" class="d-flex align-items-center text-decoration-none">
<span class="fs-4 text-success me-2"><i class="fas fa-question-circle"></i></span>
<span class="text-dark">View frequently asked questions</span>
</a>
</li>
<li class="mb-3">
<a href="#" class="d-flex align-items-center text-decoration-none">
<span class="fs-4 text-info me-2"><i class="fas fa-bell"></i></span>
<span class="text-dark">Check system status updates</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
{% if messages %}
<div class="alert-container mb-4">
{% for message in messages %}
<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endfor %}
</div>
{% endif %}
<div class="card">
<div class="card-header border-bottom d-flex justify-content-between align-items-center p-4">
<h5 class="card-title mb-0">My Tickets</h5>
<div class="input-group w-50">
<input type="text" class="form-control" placeholder="Search by ID or subject..." aria-label="Search tickets">
<button class="btn btn-outline-secondary" type="button">
<i class="fas fa-search"></i>
</button>
</div>
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-striped table-hover mb-0">
<thead class="bg-light">
<tr>
<th scope="col" class="text-secondary text-uppercase fw-bold">ID</th>
<th scope="col" class="text-secondary text-uppercase fw-bold">Subject</th>
<th scope="col" class="text-secondary text-uppercase fw-bold">Status</th>
<th scope="col" class="text-secondary text-uppercase fw-bold">Priority</th>
<th scope="col" class="text-secondary text-uppercase fw-bold">Created</th>
<th scope="col" class="text-secondary text-uppercase fw-bold text-end">Actions</th>
</tr>
</thead>
<tbody>
{% for ticket in tickets %}
<tr>
<td class="text-muted">#{{ ticket.id }}</td>
<td>{{ ticket.subject }}</td>
<td>
<span class="badge
{% if ticket.status == 'open' %}bg-primary
{% elif ticket.status == 'in_progress' %}bg-info
{% elif ticket.status == 'resolved' %}bg-success
{% else %}bg-secondary{% endif %}">
{{ ticket.get_status_display }}
</span>
</td>
<td>
<span class="badge
{% if ticket.priority == 'low' %}bg-success
{% elif ticket.priority == 'medium' %}bg-warning
{% elif ticket.priority == 'high' %}bg-danger
{% else %}bg-dark{% endif %}">
{{ ticket.get_priority_display }}
</span>
</td>
<td>{{ ticket.created_at|date:"M d, Y" }} <span class="text-muted small">{{ ticket.created_at|time:"H:i" }}</span></td>
<td class="text-end">
<a href="{% url 'ticket_detail' request.dealer.slug ticket.id %}" class="btn btn-sm btn-outline-primary">
View
</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="6" class="text-center text-muted py-5">
<i class="fas fa-ticket-alt fs-2 mb-3"></i>
<p class="mb-0">No tickets found.</p>
<p class="text-muted small">All your past and present tickets will appear here.</p>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</main>
{% endblock %}

View File

@ -1,8 +1,6 @@
{% extends "base.html" %}
{% load i18n %}
{% load crispy_forms_filters %}
{% load i18n crispy_forms_filters %}
{% block title %}
{# Check if an 'object' exists in the context #}
{% if object %}
{% trans 'Update Staff' %}
{% else %}
@ -10,49 +8,51 @@
{% endif %}
{% endblock %}
{% block content %}
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% if staff.created %}
{{ _("Edit Staff") }}
{% else %}
{{ _("Add Staff") }}
{% endif %}
<i class="fa-solid fa-user-tie text-primary ms-2"></i>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-md-8">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% if object %}
{% trans "Update Staff" %}
<i class="fa-solid fa-user-tie ms-2"></i>
{% else %}
{% trans "Add New Staff" %}
<i class="fa-solid fa-user-tie ms-2"></i>
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="row g-3 mb-3" method="post" class="form" novalidate>
{% csrf_token %}
{{ redirect_field }}
{{ form.first_name|as_crispy_field }}
{{ form.last_name|as_crispy_field }}
{{ form.arabic_name|as_crispy_field }}
{{ form.email|as_crispy_field }}
{{ form.phone_number|as_crispy_field }}
{{ form.address|as_crispy_field }}
{{ form.logo|as_crispy_field }}
{{ form.group|as_crispy_field }}
{% for error in form.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'user_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
</form>
<div class="card-body p-4 p-md-5">
<form class="needs-validation" method="post" novalidate>
{% csrf_token %}
{{ redirect_field }}
{{ form|crispy }}
{% if form.errors %}
<div class="alert alert-danger mt-4" role="alert">
<h4 class="alert-heading small">{% trans "Please correct the following errors:" %}</h4>
<ul class="mb-0">
{% for field, errors in form.errors.items %}
<li><strong>{{ field|capfirst }}:</strong> {% for error in errors %}{{ error }}{% endfor %}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'user_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
{% endblock %}
</main>
{% endblock %}

View File

@ -5,37 +5,46 @@
{% trans "Group" %}
{% endblock title %}
{% block content %}
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-5 text-center">
{{ _("Manage Groups") }}<i class="fa-solid fa-users ms-2 text-primary"></i>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5 ">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{{ _("Manage Groups") }}
<i class="fa-solid fa-users ms-2"></i>
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="row g-3 mb-3" method="post" class="form" enctype="multipart/form-data" novalidate >
{% csrf_token %}
{{ redirect_field }}
{{ form|crispy }}
{% for error in form.errors %}<div class="text-danger">{{ error }}</div>{% endfor %}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'user_detail' request.dealer.slug staff.slug %}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
</form>
<div class="card-body p-4 p-md-5">
<form class="needs-validation" method="post" enctype="multipart/form-data" novalidate>
{% csrf_token %}
{{ redirect_field }}
{{ form|crispy }}
{% if form.errors %}
<div class="alert alert-danger mt-4" role="alert">
<h4 class="alert-heading small">{% trans "Please correct the following errors:" %}</h4>
<ul class="mb-0">
{% for field, errors in form.errors.items %}
<li><strong>{{ field|capfirst }}:</strong> {% for error in errors %}{{ error }}{% endfor %}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'user_detail' request.dealer.slug staff.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
{% endblock %}
</main>
{% endblock %}

View File

@ -1,18 +1,20 @@
{% extends 'base.html' %}
{% load i18n %}
{% block content %}
<main class="d-flex align-items-center justify-content-center min-vh-100 py-5">
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp" style="background-color: #f8f9fa;">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h1 class="h3 fw-bold mb-0 text-center">
<i class="fas fa-lock me-2"></i> {% trans "Set New Password" %}
</h1>
</div>
<div class="card-body p-4 p-md-5">
<div class="text-center mb-4">
<h1 class="h3 fw-bold text-dark mb-2">{% trans "Set New Password" %}</h1>
<p class="text-muted">{% trans "Enter your new password below." %}</p>
<p class="mb-0 fs-5">{% trans "Enter your new password below." %}</p>
</div>
<form method="post" class="needs-validation" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-floating mb-3">
{{ field.errors }}
@ -20,17 +22,16 @@
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
</div>
{% endfor %}
<div class="d-grid mt-4">
<button type="submit" class="btn btn-primary btn-lg rounded-pill fw-bold">
<button type="submit" class="btn btn-phoenix-primary btn-lg rounded-pill fw-bold">
{% trans "Change Password" %}
</button>
</div>
</form>
</div>
<div class="card-footer bg-light border-0 py-3 text-center">
<div class="card-footer bg-gray-300 border-0 py-3 text-center">
<small class="text-muted">
{% trans "Remember to choose a strong password." %}
<i class="fas fa-info-circle me-1"></i> {% trans "Remember to choose a strong password." %}
</small>
</div>
</div>

View File

@ -2,7 +2,6 @@
{% load i18n %}
{% load crispy_forms_filters %}
{% block title %}
{# Check if an 'object' exists in the context #}
{% if object %}
{% trans 'Update Vendor' %}
{% else %}
@ -10,37 +9,51 @@
{% endif %}
{% endblock %}
{% block content %}
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% if vendor.created %}
{{ _("Edit Vendor") }}
{% else %}
{{ _("Add Vendor") }}
{% endif %}
<span class="fas fa-cube ms-2 text-primary"></span>
</h3>
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5 ">
<div class="col-md-8 ">
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
<h3 class="mb-0 fs-4 fw-bold text-center">
{% if object %}
{% trans "Update Vendor" %}
<i class="fas fa-cube ms-2"></i>
{% else %}
{% trans "Add New Vendor" %}
<i class="fas fa-cube ms-2"></i>
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="row g-3 mb-3" method="post" class="form" enctype="multipart/form-data" novalidate >
{% csrf_token %}
{{ redirect_field }}
{{ form|crispy }}
{% for error in form.errors %}<div class="text-danger">{{ error }}</div>{% endfor %}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{% url 'vendor_list' request.dealer.slug%}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
</form>
<div class="card-body p-4 p-md-5">
<form class="needs-validation" method="post" enctype="multipart/form-data" novalidate>
{% csrf_token %}
{{ redirect_field }}
{{ form|crispy }}
{% if form.errors %}
<div class="alert alert-danger mt-4" role="alert">
<h4 class="alert-heading small">{% trans "Please correct the following errors:" %}</h4>
<ul class="mb-0">
{% for field, errors in form.errors.items %}
<li><strong>{{ field|capfirst }}:</strong> {% for error in errors %}{{ error }}{% endfor %}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<hr class="my-4">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{% url 'vendor_list' request.dealer.slug %}" class="btn btn-phoenix-secondary btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
<!---->
{% endblock %}
</main>
{% endblock %}