diff --git a/.DS_Store b/.DS_Store index b825cb4f..81c4ed63 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/car_inventory/__pycache__/settings.cpython-311.pyc b/car_inventory/__pycache__/settings.cpython-311.pyc index e2bc7cec..9f00789e 100644 Binary files a/car_inventory/__pycache__/settings.cpython-311.pyc and b/car_inventory/__pycache__/settings.cpython-311.pyc differ diff --git a/db.sqlite b/db.sqlite index f9525f3a..acf36d5d 100644 Binary files a/db.sqlite and b/db.sqlite differ diff --git a/inventory/__pycache__/admin.cpython-311.pyc b/inventory/__pycache__/admin.cpython-311.pyc index 3f09b98a..4b7818bc 100644 Binary files a/inventory/__pycache__/admin.cpython-311.pyc and b/inventory/__pycache__/admin.cpython-311.pyc differ diff --git a/inventory/__pycache__/forms.cpython-311.pyc b/inventory/__pycache__/forms.cpython-311.pyc index 5cdcaabd..b133fbc4 100644 Binary files a/inventory/__pycache__/forms.cpython-311.pyc and b/inventory/__pycache__/forms.cpython-311.pyc differ diff --git a/inventory/__pycache__/middleware.cpython-311.pyc b/inventory/__pycache__/middleware.cpython-311.pyc index 7518b3e3..46734439 100644 Binary files a/inventory/__pycache__/middleware.cpython-311.pyc and b/inventory/__pycache__/middleware.cpython-311.pyc differ diff --git a/inventory/__pycache__/models.cpython-311.pyc b/inventory/__pycache__/models.cpython-311.pyc index e0c43dc2..d1b3161f 100644 Binary files a/inventory/__pycache__/models.cpython-311.pyc and b/inventory/__pycache__/models.cpython-311.pyc differ diff --git a/inventory/__pycache__/urls.cpython-311.pyc b/inventory/__pycache__/urls.cpython-311.pyc index cf9231e3..7c65662f 100644 Binary files a/inventory/__pycache__/urls.cpython-311.pyc and b/inventory/__pycache__/urls.cpython-311.pyc differ diff --git a/inventory/__pycache__/views.cpython-311.pyc b/inventory/__pycache__/views.cpython-311.pyc index 944c9747..3b5bb2c0 100644 Binary files a/inventory/__pycache__/views.cpython-311.pyc and b/inventory/__pycache__/views.cpython-311.pyc differ diff --git a/inventory/admin.py b/inventory/admin.py index 3e6f7337..285dc267 100644 --- a/inventory/admin.py +++ b/inventory/admin.py @@ -3,6 +3,7 @@ from . import models admin.site.register(models.Dealer) +admin.site.register(models.Staff) admin.site.register(models.Vendor) admin.site.register(models.Customer) admin.site.register(models.SaleQuotation) @@ -89,3 +90,8 @@ class CarSpecificationAdmin(admin.ModelAdmin): class Meta: verbose_name = "Car Specification" +# @admin.register(models.UserActivityLog) +# class UserActivityLogAdmin(admin.ModelAdmin): +# list_display = ('user', 'action', 'timestamp') +# search_fields = ('user__username', 'action') +# list_filter = ('timestamp',) diff --git a/inventory/forms.py b/inventory/forms.py index f62676f7..f495b017 100644 --- a/inventory/forms.py +++ b/inventory/forms.py @@ -1,6 +1,7 @@ from phonenumber_field.formfields import PhoneNumberField from django.core.validators import RegexValidator from django import forms +from django.contrib.auth import get_user_model from .mixins import AddClassMixin from django.forms.models import inlineformset_factory from .models import ( @@ -21,7 +22,8 @@ from .models import ( Representative, Payment, SaleQuotationCar, - AdditionalServices + AdditionalServices, + Staff ) from django_ledger.models import ItemModel @@ -31,6 +33,8 @@ import django_tables2 as tables from django.forms import formset_factory +User = get_user_model() + class AdditionalServiceForm(forms.ModelForm): class Meta: model = AdditionalServices @@ -41,10 +45,12 @@ class PaymentForm(forms.ModelForm): model = Payment fields = ['amount','payment_method', 'reference_number'] -class UserForm(forms.ModelForm): +class StaffForm(forms.ModelForm): + email = forms.EmailField(required=True, label="Email") class Meta: - model = Dealer - fields = ['name', 'arabic_name', 'phone_number', 'address','dealer_type'] + model = Staff + fields = ['name', 'arabic_name', 'phone_number','staff_type'] + # Dealer Form class DealerForm(forms.ModelForm): @@ -395,8 +401,10 @@ class WizardForm3(forms.Form): password = cleaned_data.get("password") confirm_password = cleaned_data.get("confirm_password") - if password and confirm_password and password != confirm_password: + if password != confirm_password: raise forms.ValidationError("Passwords do not match.") + else: + return cleaned_data class ItemForm(forms.Form): diff --git a/inventory/middleware.py b/inventory/middleware.py index e69de29b..ef228d6f 100644 --- a/inventory/middleware.py +++ b/inventory/middleware.py @@ -0,0 +1,29 @@ +import logging +from inventory import models +from django.utils import timezone + +logger = logging.getLogger('user_activity') + + +class LogUserActivityMiddleware: + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + response = self.get_response(request) + + if request.user.is_authenticated: + action = f"{request.method} {request.path}" + models.UserActivityLog.objects.create( + user=request.user, + action=action, + timestamp=timezone.now() + ) + + return response + + def get_client_ip(self, request): + x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') + if x_forwarded_for: + return x_forwarded_for.split(',')[0] + return request.META.get('REMOTE_ADDR') \ No newline at end of file diff --git a/inventory/migrations/0008_alter_dealer_options_remove_dealer_dealer_type_and_more.py b/inventory/migrations/0008_alter_dealer_options_remove_dealer_dealer_type_and_more.py new file mode 100644 index 00000000..ce4e5e58 --- /dev/null +++ b/inventory/migrations/0008_alter_dealer_options_remove_dealer_dealer_type_and_more.py @@ -0,0 +1,55 @@ +# Generated by Django 5.1.4 on 2024-12-29 15:46 + +import django.db.models.deletion +import inventory.mixins +import phonenumber_field.modelfields +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0007_vendor_created_at'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterModelOptions( + name='dealer', + options={'verbose_name': 'Dealer', 'verbose_name_plural': 'Dealers'}, + ), + migrations.RemoveField( + model_name='dealer', + name='dealer_type', + ), + migrations.RemoveField( + model_name='dealer', + name='parent_dealer', + ), + migrations.AddField( + model_name='dealer', + name='updated_at', + field=models.DateTimeField(auto_now=True, verbose_name='Updated At'), + ), + migrations.CreateModel( + name='Staff', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, verbose_name='Name')), + ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), + ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), + ('staff_type', models.CharField(choices=[('manager', 'Manager'), ('inventory', 'Inventory'), ('accountant', 'Accountant'), ('sales', 'Sales'), ('receptionist', 'Receptionist'), ('technician', 'Technician'), ('driver', 'Driver')], max_length=255, verbose_name='Staff Type')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), + ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), + ('dealer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='inventory.dealer')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='staff', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'Staff', + 'verbose_name_plural': 'Staff', + 'permissions': [], + }, + bases=(models.Model, inventory.mixins.LocalizedNameMixin), + ), + ] diff --git a/inventory/migrations/0009_alter_additionalservices_uom_alter_staff_dealer.py b/inventory/migrations/0009_alter_additionalservices_uom_alter_staff_dealer.py new file mode 100644 index 00000000..fe0bce61 --- /dev/null +++ b/inventory/migrations/0009_alter_additionalservices_uom_alter_staff_dealer.py @@ -0,0 +1,25 @@ +# Generated by Django 5.1.4 on 2024-12-30 01:50 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0008_alter_dealer_options_remove_dealer_dealer_type_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='additionalservices', + name='uom', + field=models.CharField(choices=[('Unit', 'Unit'), ('Kg', 'Kg'), ('L', 'L'), ('m', 'm'), ('cm', 'cm'), ('m2', 'm2'), ('m3', 'm3'), ('m3', 'm3')], max_length=10, verbose_name='Unit of Measurement'), + ), + migrations.AlterField( + model_name='staff', + name='dealer', + field=models.ForeignKey(default=8, on_delete=django.db.models.deletion.CASCADE, related_name='staff', to='inventory.dealer'), + preserve_default=False, + ), + ] diff --git a/inventory/migrations/0010_useractivitylog.py b/inventory/migrations/0010_useractivitylog.py new file mode 100644 index 00000000..6d9fab8f --- /dev/null +++ b/inventory/migrations/0010_useractivitylog.py @@ -0,0 +1,30 @@ +# Generated by Django 5.1.4 on 2024-12-30 02:50 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0009_alter_additionalservices_uom_alter_staff_dealer'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='UserActivityLog', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('action', models.TextField()), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'User Activity Log', + 'verbose_name_plural': 'User Activity Logs', + 'ordering': ['-timestamp'], + }, + ), + ] diff --git a/inventory/migrations/0011_delete_useractivitylog.py b/inventory/migrations/0011_delete_useractivitylog.py new file mode 100644 index 00000000..a7302bbd --- /dev/null +++ b/inventory/migrations/0011_delete_useractivitylog.py @@ -0,0 +1,16 @@ +# Generated by Django 5.1.4 on 2024-12-30 03:11 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0010_useractivitylog'), + ] + + operations = [ + migrations.DeleteModel( + name='UserActivityLog', + ), + ] diff --git a/inventory/migrations/0012_representative_email.py b/inventory/migrations/0012_representative_email.py new file mode 100644 index 00000000..4e4ab042 --- /dev/null +++ b/inventory/migrations/0012_representative_email.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.4 on 2024-12-30 03:42 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0011_delete_useractivitylog'), + ] + + operations = [ + migrations.AddField( + model_name='representative', + name='email', + field=models.EmailField(default='mail@mail.com', max_length=255, verbose_name='Email Address'), + preserve_default=False, + ), + ] diff --git a/inventory/migrations/0013_organization_created_at.py b/inventory/migrations/0013_organization_created_at.py new file mode 100644 index 00000000..c8138396 --- /dev/null +++ b/inventory/migrations/0013_organization_created_at.py @@ -0,0 +1,20 @@ +# Generated by Django 5.1.4 on 2024-12-30 03:59 + +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0012_representative_email'), + ] + + operations = [ + migrations.AddField( + model_name='organization', + name='created_at', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Created At'), + preserve_default=False, + ), + ] diff --git a/inventory/migrations/0014_useractivitylog.py b/inventory/migrations/0014_useractivitylog.py new file mode 100644 index 00000000..d4a1bf1f --- /dev/null +++ b/inventory/migrations/0014_useractivitylog.py @@ -0,0 +1,30 @@ +# Generated by Django 5.1.4 on 2024-12-30 10:49 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0013_organization_created_at'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='UserActivityLog', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('action', models.TextField()), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'User Activity Log', + 'verbose_name_plural': 'User Activity Logs', + 'ordering': ['-timestamp'], + }, + ), + ] diff --git a/inventory/models.py b/inventory/models.py index 4768a62b..57a4e8de 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -33,12 +33,13 @@ from django_ledger.models import EntityModel class DealerUserManager(UserManager): def create_user_with_dealer(self, email, password, dealer_name, arabic_name, crn, vrn, address, **extra_fields): user = self.create_user(email=email, password=password, **extra_fields) - Dealer.objects.create(user=user, name=dealer_name, ) + Dealer.objects.create(user=user, name=dealer_name,arabic_name=arabic_name, crn=crn, vrn=vrn, address=address, **extra_fields) return user UNIT_CHOICES = ( + ("Unit", _("Unit")), ("Kg", _("Kg")), ("L", _("L")), ("m", _("m")), @@ -544,16 +545,17 @@ class Dealer(models.Model, LocalizedNameMixin): verbose_name=_("Logo")) entity = models.ForeignKey(EntityModel, on_delete=models.SET_NULL, null=True, blank=True) joined_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Joined At")) - parent_dealer = models.ForeignKey( "self", - on_delete=models.SET_NULL, - blank=True, - null=True, - verbose_name=_("Parent Dealer"), - related_name="sub_dealers",) - dealer_type = models.CharField(max_length=255, - choices=DEALER_TYPES.choices, - verbose_name=_("Dealer Type"), - default=DEALER_TYPES.OWNER,) + updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated At")) + # parent_dealer = models.ForeignKey( "self", + # on_delete=models.SET_NULL, + # blank=True, + # null=True, + # verbose_name=_("Parent Dealer"), + # related_name="sub_dealers",) + # dealer_type = models.CharField(max_length=255, + # choices=DEALER_TYPES.choices, + # verbose_name=_("Dealer Type"), + # default=DEALER_TYPES.OWNER,) objects = DealerUserManager() @property @@ -565,11 +567,10 @@ class Dealer(models.Model, LocalizedNameMixin): @property def get_plan(self): - """Get the price of the active subscription plan for the dealer.""" active_plan = self.get_active_plan if active_plan: subscription_plan = SubscriptionPlan.objects.filter( - name=active_plan.plan + pk=active_plan.pk ).first() if subscription_plan: return subscription_plan @@ -578,56 +579,57 @@ class Dealer(models.Model, LocalizedNameMixin): class Meta: verbose_name = _("Dealer") verbose_name_plural = _("Dealers") - permissions = [ - ('change_dealer_type', 'Can change dealer type'), - ] + # permissions = [ + # ('change_dealer_type', 'Can change dealer type'), + # ] def __str__(self): return self.name - @property - def get_sub_dealers(self): - if self.dealer_type == "OWNER": - return self.sub_dealers.all() - return None - - @property - def is_parent(self): - return self.dealer_type == "OWNER" - @property - def get_root_dealer(self): - return self.parent_dealer if self.parent_dealer else self - -# @receiver(post_save, sender=User) -# def create_dealer(instance, created, *args, **kwargs): -# if created: -# Dealer.objects.create(user=instance) + # @property + # def get_sub_dealers(self): + # if self.dealer_type == "OWNER": + # return self.sub_dealers.all() + # return None + # + # @property + # def is_parent(self): + # return self.dealer_type == "OWNER" + # @property + # def get_root_dealer(self): + # return self.parent_dealer if self.parent_dealer else self + + + +class STAFF_TYPES(models.TextChoices): + MANAGER = "manager", _("Manager") + INVENTORY = "inventory", _("Inventory") + ACCOUNTANT = "accountant", _("Accountant") + SALES = "sales", _("Sales") + RECEPTIONIST = "receptionist", _("Receptionist") + TECHNICIAN = "technician", _("Technician") + DRIVER = "driver", _("Driver") + + +class Staff(models.Model, LocalizedNameMixin): + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="staff") + dealer = models.ForeignKey(Dealer, on_delete=models.CASCADE, related_name="staff") + name = models.CharField(max_length=255, verbose_name=_("Name")) + arabic_name = models.CharField(max_length=255, verbose_name=_("Arabic Name")) + phone_number = PhoneNumberField(region="SA", verbose_name=_("Phone Number")) + staff_type = models.CharField(choices=STAFF_TYPES.choices, max_length=255, verbose_name=_("Staff Type")) + created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created At")) + updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated At")) + + class Meta: + verbose_name = _("Staff") + verbose_name_plural = _("Staff") + permissions = [] + + def __str__(self): + return f"{self.name} - {self.dealer}" -# class STAFF_TYPES(models.TextChoices): -# # Owner = "Owner", _("Owner") -# MANAGER = "manager", _("Manager") -# INVENTORY = "inventory", _("Inventory") -# ACCOUNTANT = "accountant", _("Accountant") -# SALES = "sales", _("Sales") -# RECEPTIONIST = "receptionist", _("Receptionist") -# TECHNICIAN = "technician", _("Technician") -# DRIVER = "driver", _("Driver") -# -# -# class Staff(models.Model, LocalizedNameMixin): -# user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="staff") -# dealer = models.ForeignKey(Dealer, on_delete=models.SET_NULL, null=True, blank=True) -# name = models.CharField(max_length=255, verbose_name=_("Name")) -# arabic_name = models.CharField(max_length=255, verbose_name=_("Arabic Name")) -# staff_type = models.CharField(choices=STAFF_TYPES.choices, max_length=255, verbose_name=_("Staff Type")) -# created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created At")) -# updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated At")) -# -# class Meta: -# verbose_name = _("Staff") -# verbose_name_plural = _("Staff") -# permissions = [] # Vendor Model @@ -704,6 +706,7 @@ class Organization(models.Model, LocalizedNameMixin): phone_number = PhoneNumberField(region='SA', verbose_name=_("Phone Number")) address = models.CharField(max_length=200, blank=True, null=True, verbose_name=_("Address")) logo = models.ImageField(upload_to="logos", blank=True, null=True, verbose_name=_("Logo")) + created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created At")) class Meta: verbose_name = _("Organization") @@ -718,6 +721,7 @@ class Representative(models.Model, LocalizedNameMixin): arabic_name = models.CharField(max_length=255, verbose_name=_("Arabic Name")) id_number = models.CharField(max_length=10, verbose_name=_("ID Number")) phone_number = PhoneNumberField(region='SA', verbose_name=_("Phone Number")) + email = models.EmailField(max_length=255, verbose_name=_("Email Address")) address = models.CharField(max_length=200, blank=True, null=True, verbose_name=_("Address")) organization = models.ManyToManyField(Organization, related_name='representatives') @@ -939,4 +943,18 @@ class Refund(models.Model): verbose_name_plural = _("refunds") def __str__(self): - return f"Refund of {self.amount} on {self.refund_date}" \ No newline at end of file + return f"Refund of {self.amount} on {self.refund_date}" + + +class UserActivityLog(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + action = models.TextField() + timestamp = models.DateTimeField(auto_now_add=True) + + class Meta: + verbose_name = "User Activity Log" + verbose_name_plural = "User Activity Logs" + ordering = ['-timestamp'] + + def __str__(self): + return f"{self.user.email} - {self.action} - {self.timestamp}" \ No newline at end of file diff --git a/inventory/signals.py b/inventory/signals.py index 38559ba6..bf402937 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -3,7 +3,7 @@ from django.dispatch import receiver from django.utils.translation import gettext_lazy as _ from django.contrib.auth import get_user_model from django_ledger.io import roles -from django_ledger.models import EntityModel,AccountModel,ItemModel,ItemModelAbstract,UnitOfMeasureModel +from django_ledger.models import EntityModel,AccountModel,ItemModel,ItemModelAbstract,UnitOfMeasureModel, VendorModel from . import models User = get_user_model() @@ -49,13 +49,13 @@ def create_car_location(sender, instance, created, **kwargs): """ try: if created: - if instance.dealer is None: + if instance.user.dealer is None: raise ValueError(f"Cannot create CarLocation for car {instance.vin}: dealer is missing.") models.CarLocation.objects.create( car=instance, - owner=instance.dealer, - showroom=instance.dealer, + owner=instance.user.dealer, + showroom=instance.user.dealer, description=f"Initial location set for car {instance.vin}." ) print("Car Location created") @@ -83,105 +83,112 @@ def update_car_status_on_reservation_delete(sender, instance, **kwargs): @receiver(post_save, sender=models.Dealer) def create_ledger_entity(sender, instance, created, **kwargs): if created: - root_dealer = instance.get_root_dealer - if not root_dealer.entity: - entity_name = f"{root_dealer.name}-{root_dealer.joined_at.date()}" - entity = EntityModel.create_entity( - name=entity_name, - admin=root_dealer.user, - use_accrual_method=False, - fy_start_month=1, + entity_name = instance.user.dealer.name + entity = EntityModel.create_entity( + name=entity_name, + admin=instance.user, + use_accrual_method=False, + fy_start_month=1, + ) + + if entity: + instance.entity = entity + instance.save() + coa = entity.create_chart_of_accounts( + assign_as_default=True, commit=True, coa_name=_(f"{entity_name}-COA") + ) + if coa: + # entity.populate_default_coa(activate_accounts=True, coa_model=coa) + print(f"Ledger entity created for Dealer: {instance.name}") + + # Create Cash Account + entity.create_account( + coa_model=coa, + code="101", + role=roles.ASSET_CA_CASH, + name=_("Cash"), + balance_type="debit", + active=True, ) - if entity: - instance.entity = entity - instance.save() - coa = entity.create_chart_of_accounts( - assign_as_default=True, commit=True, coa_name=_(f"{entity_name}-COA") - ) - if coa: - # entity.populate_default_coa(activate_accounts=True, coa_model=coa) - print(f"Ledger entity created for Dealer: {instance.name}") + # Create Accounts Receivable Account + entity.create_account( + coa_model=coa, + code="102", + role=roles.ASSET_CA_RECEIVABLES, + name=_("Accounts Receivable"), + balance_type="debit", + active=True, + ) - # Create Cash Account - entity.create_account( - coa_model=coa, - code="1010", - role=roles.ASSET_CA_CASH, - name=_("Cash"), - balance_type="debit", - active=True, - ) + # Create Inventory Account + entity.create_account( + coa_model=coa, + code="103", + role=roles.ASSET_CA_INVENTORY, + name=_("Inventory"), + balance_type="debit", + active=True, + ) - # Create Accounts Receivable Account - entity.create_account( - coa_model=coa, - code="1020", - role=roles.ASSET_CA_RECEIVABLES, - name=_("Accounts Receivable"), - balance_type="debit", - active=True, - ) - - # Create Inventory Account - entity.create_account( - coa_model=coa, - code="1030", - role=roles.ASSET_CA_INVENTORY, - name=_("Inventory"), - balance_type="debit", - active=True, - ) + # Create Accounts Payable Account + entity.create_account( + coa_model=coa, + code="101", + role=roles.LIABILITY_CL_ACC_PAYABLE, + name=_("Accounts Payable"), + balance_type="credit", + active=True, + ) + # Create Equity Account + entity.create_account( + coa_model=coa, + code="101", + role=roles.EQUITY_CAPITAL, + name=_("Partners Current"), + balance_type="credit", + active=True, + ) - # Create Accounts Payable Account - entity.create_account( - coa_model=coa, - code="2010", - role=roles.LIABILITY_CL_ACC_PAYABLE, - name=_("Accounts Payable"), - balance_type="credit", - active=True, - ) + # Create Sales Revenue Account + entity.create_account( + coa_model=coa, + code="101", + role=roles.INCOME_OPERATIONAL, + name=_("Sales Revenue"), + balance_type="credit", + active=True, + ) - # Create Sales Revenue Account - entity.create_account( - coa_model=coa, - code="4010", - role=roles.INCOME_OPERATIONAL, - name=_("Sales Revenue"), - balance_type="credit", - active=True, - ) + # Create Cost of Goods Sold Account + entity.create_account( + coa_model=coa, + code="101", + role=roles.COGS, + name=_("Cost of Goods Sold"), + balance_type="debit", + active=True, + ) - # Create Cost of Goods Sold Account - entity.create_account( - coa_model=coa, - code="5010", - role=roles.COGS, - name=_("Cost of Goods Sold"), - balance_type="debit", - active=True, - ) + # Create Rent Expense Account + entity.create_account( + coa_model=coa, + code="101", + role=roles.EXPENSE_OPERATIONAL, + name=_("Rent Expense"), + balance_type="debit", + active=True, + ) - # Create Rent Expense Account - entity.create_account( - coa_model=coa, - code="6010", - role=roles.EXPENSE_OPERATIONAL, - name=_("Rent Expense"), - balance_type="debit", - active=True, - ) - - # Create Utilities Expense Account - entity.create_account( - coa_model=coa, - code="6020", - role=roles.EXPENSE_OPERATIONAL, - name=_("Utilities Expense"), - balance_type="debit", - active=True, - ) + # Create Utilities Expense Account + entity.create_account( + coa_model=coa, + code="6020", + role=roles.EXPENSE_OPERATIONAL, + name=_("Utilities Expense"), + balance_type="debit", + active=True, + ) # Create Vendor @@ -192,18 +199,20 @@ def create_ledger_vendor(sender, instance, created, **kwargs): entity = EntityModel.objects.filter(name=instance.dealer.name).first() entity.create_vendor( - name=instance.name, - vendor_number=instance.crn, - address_1=instance.address, - phone=instance.phone_number, - tax_id_number=instance.vrn, - active=True, - hidden=False, - additional_info={ - "arabic_name": instance.arabic_name, - "contact_person": instance.contact_person, - }) - + vendor_model_kwargs={ + "vendor_name": instance.name, + "vendor_number": instance.crn, + "address_1": instance.address, + "phone": instance.phone_number, + "tax_id_number": instance.vrn, + "active": True, + "hidden": False, + "additional_info": { + "arabic_name": instance.arabic_name, + "contact_person": instance.contact_person, + } + } + ) print(f"VendorModel created for Vendor: {instance.name}") @@ -211,7 +220,7 @@ def create_ledger_vendor(sender, instance, created, **kwargs): @receiver(post_save, sender=models.Customer) def create_customer(sender, instance, created, **kwargs): if created: - dealer = instance.dealer.get_root_dealer + dealer = instance.dealer entity = dealer.entity name = f"{instance.first_name} {instance.middle_name} {instance.last_name}" if entity: @@ -232,31 +241,65 @@ def create_customer(sender, instance, created, **kwargs): # Create Item -@receiver(post_save, sender=models.Car) -def create_item_model(sender, instance, created, **kwargs): - item_name = f"{instance.year} - {instance.id_car_make} - {instance.id_car_model} - {instance.id_car_trim}" - dealer = instance.dealer - entity = dealer.entity - - if not entity: - return - - uom_name = _("Car") - unit_abbr = _("C") - uom = entity.get_uom_all().filter(name=uom_name, unit_abbr=unit_abbr).first() - if not uom: - uom = entity.create_uom( - name=uom_name, - unit_abbr=unit_abbr - ) - - entity.create_item_product( - name=item_name, - uom_model=uom, - item_type=ItemModel.ITEM_TYPE_MATERIAL) - - print(f"ItemModel for Car:") - +# @receiver(post_save, sender=models.Car) +# def create_item_model(sender, instance, created, **kwargs): +# item_name = f"{instance.year} - {instance.id_car_make} - {instance.id_car_model} - {instance.id_car_trim}" +# uom_name = _("Car") +# unit_abbr = _("C") +# +# uom, uom_created = UnitOfMeasureModel.objects.get_or_create( +# name=uom_name, +# unit_abbr=unit_abbr +# ) +# +# if uom_created: +# print(f"UOM created: {uom_name}") +# else: +# print(f"Using existing UOM: {uom_name}") +# +# entity = EntityModel.objects.filter(name=instance.dealer.name).first() +# +# inventory_account = AccountModel.objects.first() +# cogs_account = AccountModel.objects.first() +# earnings_account = AccountModel.objects.first() +# +# entity.create_item_product( +# item_name=item_name, +# item_role=ItemModelAbstract.ITEM_ROLE_PRODUCT, +# item_type=ItemModelAbstract.ITEM_TYPE_MATERIAL, +# item_id=instance.vin, +# sold_as_unit=True, +# inventory_received=1.00, +# inventory_received_value=0.00, +# inventory_account=inventory_account, +# for_inventory=True,) +# +# item = ItemModel.objects.create( +# entity=entity, +# uom=uom, +# name=item_name, +# item_role=ItemModelAbstract.ITEM_ROLE_INVENTORY, +# item_type=ItemModelAbstract.ITEM_TYPE_MATERIAL, +# item_id=instance.vin, +# sold_as_unit=True, +# inventory_received=1.00, +# inventory_received_value=0.00, +# inventory_account=inventory_account, +# for_inventory=True, +# is_product_or_service=True, +# cogs_account=cogs_account, +# earnings_account=earnings_account, +# is_active=True, +# additional_info={ +# "remarks": instance.remarks, +# "status": instance.status, +# "stock_type": instance.stock_type, +# "mileage": instance.mileage, +# }, +# ) +# +# print(f"ItemModel {'created' if created else 'updated'} for Car: {item.name}") +# # # # update price - CarFinance # @receiver(post_save, sender=CarFinance) @@ -269,6 +312,7 @@ def create_item_model(sender, instance, created, **kwargs): # print(f"Inventory item updated with CarFinance data for Car: {instance.car}") + # @receiver(pre_save, sender=models.SaleQuotation) # def update_quotation_status(sender, instance, **kwargs): # if instance.valid_until and timezone.now() > instance.valid_until: diff --git a/inventory/urls.py b/inventory/urls.py index f949e65a..4de53a8b 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -31,6 +31,7 @@ urlpatterns = [ # Dealer URLs path('dealers//', views.DealerDetailView.as_view(), name='dealer_detail'), path('dealers//update/', views.DealerUpdateView.as_view(), name='dealer_update'), + path('dealers/activity/', views.UserActivityLogListView.as_view(), name='dealer_activity'), # path('dealers//delete/', views.DealerDeleteView.as_view(), name='dealer_delete'), # Customer URLs @@ -91,7 +92,7 @@ urlpatterns = [ path('user//update/', views.UserUpdateView.as_view(), name='user_update'), path('user//', views.UserDetailView.as_view(), name='user_detail'), path('user/', views.UserListView.as_view(), name='user_list'), - path('user//confirm/', views.UserDeleteview, name='user_delete'), + path('user//confirm/', views.UserDeleteview, name='user_delete'), # Organization URLs path('organizations/', views.OrganizationListView.as_view(), name='organization_list'), path('organizations//', views.OrganizationDetailView.as_view(), name='organization_detail'), diff --git a/inventory/utilities/financials.py b/inventory/utilities/financials.py index ffbb56de..a7ae39e2 100644 --- a/inventory/utilities/financials.py +++ b/inventory/utilities/financials.py @@ -24,7 +24,7 @@ def get_financial_value(name,vat=False): def get_total_financials(instance,vat=False): total = 0 if instance.additional_services.count() != 0: - total = sum(x.price for x in instance.additional_services) + instance.selling_price + total = sum(x.price for x in instance.additional_services.all()) + instance.selling_price if vat: total = (total * settings.VAT_RATE).quantize(Decimal('0.01')) + total return total diff --git a/inventory/views.py b/inventory/views.py index f73c2c77..95b4cb24 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -1,12 +1,16 @@ +from django.core.paginator import Paginator +from django.views.decorators.csrf import csrf_exempt from django_ledger.models import EntityModel, InvoiceModel,BankAccountModel,AccountModel,JournalEntryModel,TransactionModel,EstimateModel,CustomerModel from django.core.mail import send_mail from django_ledger.forms.bank_account import BankAccountCreateForm,BankAccountUpdateForm from django_ledger.forms.account import AccountModelCreateForm,AccountModelUpdateForm from django_ledger.forms.estimate import EstimateModelCreateForm +from django.contrib.admin.models import LogEntry import logging import json import datetime from decimal import Decimal +from django.db.models.functions import Coalesce from django.shortcuts import HttpResponse from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.decorators import login_required @@ -46,6 +50,7 @@ from django.contrib.auth.models import Group from .utils import get_calculations from django.contrib.auth.models import User from allauth.account import views +from django.db.models import Count, F, Value logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) @@ -93,15 +98,16 @@ def dealer_signup(request, *args, **kwargs): wf1 = data.get("wizardValidationForm1") wf2 = data.get("wizardValidationForm2") wf3 = data.get("wizardValidationForm3") - name = wf1.get("name") - arabic_name = wf1.get("arabic_name") email = wf1.get("email") + password = wf1.get("password") + password_confirm = wf1.get("confirm_password") + name = wf2.get("name") + arabic_name = wf2.get("arabic_name") phone = wf2.get("phone_number") - crn = wf2.get("crn") - vrn = wf2.get("vrn") - address = wf2.get("address") - password = wf3.get("password") - password_confirm = wf3.get("confirm_password") + crn = wf3.get("crn") + vrn = wf3.get("vrn") + address = wf3.get("address") + if password != password_confirm: return JsonResponse({"error": "Passwords do not match."}, status=400) @@ -109,16 +115,14 @@ def dealer_signup(request, *args, **kwargs): try: with transaction.atomic(): user = User.objects.create(email=email, password=password) - user.set_password(password) - user.save() + models.Dealer.objects.create(user=user, name=name, arabic_name=arabic_name, crn=crn, vrn=vrn, phone_number=phone, - address=address, - dealer_type="OWNER",) + address=address,) return JsonResponse({"message": "User created successfully."}, status=200) except Exception as e: return JsonResponse({"error": str(e)}, status=400) @@ -143,8 +147,8 @@ class AccountingDashboard(LoginRequiredMixin, TemplateView): def dispatch(self, request, *args, **kwargs): if ( - not any(hasattr(request.user, attr) for attr in ["dealer", "subdealer"]) - or not request.user.is_authenticated + # not any(hasattr(request.user, attr) for attr in ["dealer", "subdealer"]) + not request.user.is_authenticated ): # messages.error(request, _("You are not associated with any dealer.")) return redirect("welcome") @@ -192,7 +196,7 @@ class CarCreateView(LoginRequiredMixin, CreateView): return reverse("inventory_stats") def form_valid(self, form): - form.instance.dealer = self.request.user.dealer.get_root_dealer + form.instance.dealer = self.request.user.dealer form.save() messages.success(self.request, "Car saved successfully.") return super().form_valid(form) @@ -347,7 +351,7 @@ class CarInventory(LoginRequiredMixin, ListView): trim_id = self.kwargs['trim_id'] cars = models.Car.objects.filter( - dealer=self.request.user.dealer.get_root_dealer, + dealer=self.request.user.dealer, id_car_make=make_id, id_car_model=model_id, id_car_trim=trim_id, @@ -391,7 +395,7 @@ def inventory_stats_view(request): # Annotate total cars by make, model, and trim cars = ( - models.Car.objects.filter(dealer=dealer.get_root_dealer) + models.Car.objects.filter(dealer=dealer) .select_related("id_car_make", "id_car_model", "id_car_trim") .annotate( make_total=Count("id_car_make"), @@ -533,7 +537,7 @@ class CarLocationCreateView(CreateView): def form_valid(self, form): form.instance.car = get_object_or_404(models.Car, pk=self.kwargs["car_pk"]) - form.instance.OWNER = self.request.user.dealer + form.instance.owner = self.request.user.dealer form.save() messages.success(self.request, "Car saved successfully.") return super().form_valid(form) @@ -625,6 +629,13 @@ class DealerDetailView(LoginRequiredMixin, DetailView): template_name = "dealers/dealer_detail.html" context_object_name = "dealer" + def get_queryset(self): + total_count = models.Dealer.objects.annotate( + staff_count=Coalesce(Count('staff'), Value(0)), + total_count=F('staff_count') + Value(1)) + return total_count + + class DealerUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView): model = models.Dealer @@ -636,17 +647,17 @@ class DealerUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView): def get_success_url(self): return reverse("dealer_detail", kwargs={"pk": self.object.pk}) - def get_form(self, form_class=None): - form = super().get_form(form_class) - if hasattr(form.fields, "dealer_type"): - form.fields.pop("dealer_type") - return form - - def get_form_class(self): - if self.request.user.dealer.dealer_type == "OWNER": - return forms.DealerForm - else: - return forms.UserForm + # def get_form(self, form_class=None): + # form = super().get_form(form_class) + # if hasattr(form.fields, "dealer_type"): + # form.fields.pop("dealer_type") + # return form + # + # def get_form_class(self): + # if self.request.user.dealer.dealer_type == "OWNER": + # return forms.DealerForm + # else: + # return forms.UserForm class CustomerListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): @@ -660,7 +671,7 @@ class CustomerListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): def get_queryset(self): query = self.request.GET.get("q") customers = models.Customer.objects.filter( - dealer=self.request.user.dealer.get_root_dealer + dealer=self.request.user.dealer ) if query: @@ -697,6 +708,10 @@ class CustomerCreateView( permission_required = ("inventory.add_customer",) success_message = _("Customer created successfully.") + def form_valid(self, form): + form.instance.dealer = self.request.user.dealer + return super().form_valid(form) + class CustomerUpdateView( @@ -784,7 +799,7 @@ class QuotationCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateVie permission_required = ("inventory.add_salequotation",) def form_valid(self, form): - dealer = self.request.user.dealer.get_root_dealer + dealer = self.request.user.dealer form.instance.dealer = dealer quotation = form.save() selected_cars = form.cleaned_data.get("cars") @@ -809,7 +824,7 @@ class QuotationListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): def get_queryset(self): status = self.request.GET.get("status") - queryset = self.request.user.dealer.get_root_dealer.sales.all() + queryset = self.request.user.dealer.sales.all() if status: queryset = queryset.filter(status=status) return queryset @@ -834,7 +849,7 @@ class QuotationDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailVie @login_required def generate_invoice(request, pk): quotation = get_object_or_404(models.SaleQuotation, pk=pk) - dealer = request.user.dealer.get_root_dealer + dealer = request.user.dealer entity = dealer.entity if not quotation.is_approved: messages.error( @@ -981,7 +996,7 @@ def generate_invoice(request, pk): @login_required def post_quotation(request, pk): qoutation = get_object_or_404(models.SaleQuotation, pk=pk) - dealer = request.user.dealer.get_root_dealer + dealer = request.user.dealer entity = dealer.entity if qoutation.posted: messages.error(request, "Quotation is already posted") @@ -1037,7 +1052,7 @@ def post_quotation(request, pk): def mark_quotation(request, pk): qoutation = get_object_or_404(models.SaleQuotation, pk=pk) status = request.GET.get("status") - dealer = request.user.dealer.get_root_dealer + dealer = request.user.dealer entity = dealer.entity date = datetime.datetime.now() customer = entity.get_customers().filter(customer_name=qoutation.customer.get_full_name).first() @@ -1052,7 +1067,7 @@ def mark_quotation(request, pk): messages.error(request, "Quotation is not ready for approval") return redirect("quotation_detail", pk=pk) - invoice_model.mark_as_approved(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user) + invoice_model.mark_as_approved(entity_slug=entity.slug, user_model=request.user.dealer) invoice_model.date_approved = date qoutation.date_approved = date invoice_model.save() @@ -1072,7 +1087,7 @@ def mark_quotation(request, pk): messages.error(request, "Quotation is not ready for payment") return redirect("quotation_detail", pk=pk) - invoice_model.mark_as_paid(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user) + invoice_model.mark_as_paid(entity_slug=entity.slug, user_model=request.user.dealer) invoice_model.date_paid = date qoutation.date_paid = date invoice_model.save() @@ -1118,28 +1133,16 @@ class SalesOrderDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailVi # Users class UserListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): - model = models.Dealer + model = models.Staff context_object_name = "users" paginate_by = 10 template_name = "users/user_list.html" permission_required = ("inventory.view_dealer",) - def get_queryset(self): - query = self.request.GET.get("q") - users = self.request.user.dealer.sub_dealers - - if query: - users = users.filter( - Q(name__icontains=query) - | Q(arabic_name__icontains=query) - | Q(phone_number__icontains=query) - | Q(address__icontains=query) - ) - return users.all() class UserDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): - model = models.Dealer + model = models.Staff template_name = "users/user_detail.html" context_object_name = "user_" permission_required = ("inventory.view_dealer",) @@ -1151,39 +1154,24 @@ class UserCreateView( SuccessMessageMixin, CreateView, ): - model = models.Dealer - form_class = forms.UserForm + model = models.Staff + form_class = forms.StaffForm template_name = "users/user_form.html" success_url = reverse_lazy("user_list") permission_required = ("inventory.add_dealer",) success_message = _("User created successfully.") - def get_form(self, form_class=None): - form = super().get_form(form_class) - form.fields["dealer_type"].choices = [ - t for t in form.fields["dealer_type"].choices if t[0] != "OWNER" - ] - return form def form_valid(self, form): - dealer = self.request.user.dealer.get_root_dealer - if dealer.sub_dealers.count() >= dealer.get_active_plan.max_users: - messages.error( - self.request, _("You have reached the maximum number of users.") - ) - return redirect("user_list") + form.instance.dealer = self.request.user.dealer + email = form.cleaned_data['email'] + password = "Tenhal@123" + user = User.objects.create_user(username=email, email=email, password=password) + + staff = form.save(commit=False) + staff.user = user + staff.save() - user = User.objects.create_user(username=form.cleaned_data["name"]) - user.set_password("Tenhal@123") - user.save() - form.instance.user = user - form.instance.parent_dealer = dealer - for group in user.groups.all(): - group.user_set.remove(user) - Group.objects.get(name=form.cleaned_data["dealer_type"].lower()).user_set.add( - user - ) - form.save() return super().form_valid(form) @@ -1193,28 +1181,19 @@ class UserUpdateView( SuccessMessageMixin, UpdateView, ): - model = models.Dealer - form_class = forms.UserForm + model = models.Staff + form_class = forms.StaffForm template_name = "users/user_form.html" success_url = reverse_lazy("user_list") permission_required = ("inventory.change_dealer",) success_message = _("User updated successfully.") - def get_form(self, form_class=None): - form = super().get_form(form_class) - if not self.request.user.has_perms(["inventory.change_dealer_type"]): - field = form.fields["dealer_type"] - field.widget = field.hidden_widget() - form.fields["dealer_type"].choices = [ - t for t in form.fields["dealer_type"].choices if t[0] != "Owner" - ] - return form def form_valid(self, form): user = form.instance.user for group in user.groups.all(): group.user_set.remove(user) - Group.objects.get(name=form.cleaned_data["dealer_type"].lower()).user_set.add( + Group.objects.get(name=form.cleaned_data["staff_type"].lower()).user_set.add( user ) form.save() @@ -1222,7 +1201,7 @@ class UserUpdateView( def UserDeleteview(request, pk): - user = get_object_or_404(models.Dealer, pk=pk) + user = get_object_or_404(models.Staff, pk=pk) user.delete() messages.success(request, _("User deleted successfully.")) return redirect("user_list") @@ -1249,6 +1228,8 @@ class OrganizationListView(LoginRequiredMixin, ListView): model = models.Organization template_name = "organizations/organization_list.html" context_object_name = "organizations" + paginate_by = 10 + class OrganizationDetailView(DetailView): @@ -1266,7 +1247,7 @@ class OrganizationCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView def form_valid(self, form): if form.is_valid(): - form.instance.dealer = self.request.user.dealer.get_root_dealer + form.instance.dealer = self.request.user.dealer form.save() return super().form_valid(form) else: @@ -1309,7 +1290,7 @@ class RepresentativeCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateVi def form_valid(self, form): if form.is_valid(): - form.instance.dealer = self.request.user.dealer.get_root_dealer + form.instance.dealer = self.request.user.dealer form.save() return super().form_valid(form) else: @@ -1382,7 +1363,7 @@ def download_quotation_pdf(request, quotation_id): @login_required def invoice_detail(request,pk): quotation = get_object_or_404(models.SaleQuotation, pk=pk) - dealer = request.user.dealer.get_root_dealer + dealer = request.user.dealer entity = dealer.entity customer = entity.get_customers().filter(customer_name=quotation.customer.get_full_name).first() invoice_model = entity.get_invoices() @@ -1395,7 +1376,7 @@ def invoice_detail(request,pk): @login_required def payment_invoice(request,pk): quotation = get_object_or_404(models.SaleQuotation, pk=pk) - dealer = request.user.dealer.get_root_dealer + dealer = request.user.dealer entity = dealer.entity customer = entity.get_customers().filter(customer_name=quotation.customer.get_full_name).first() invoice_model = entity.get_invoices() @@ -1425,14 +1406,14 @@ def payment_invoice(request,pk): def payment_create(request, pk): quotation = get_object_or_404(models.SaleQuotation, pk=pk) - dealer = request.user.dealer.get_root_dealer + dealer = request.user.dealer if request.method == "POST": form = forms.PaymentForm(request.POST) if form.is_valid(): form.instance.quotation = quotation insatnce = form.save() - dealer = request.user.dealer.get_root_dealer + dealer = request.user.dealer entity = dealer.entity customer = entity.get_customers().filter(customer_name=quotation.customer.get_full_name).first() coa_qs, coa_map = entity.get_all_coa_accounts() @@ -1461,7 +1442,7 @@ def payment_create(request, pk): invoice_model = entity.get_invoices().filter(date_approved=quotation.date_approved).first() - invoice_model.mark_as_paid(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user) + invoice_model.mark_as_paid(entity_slug=entity.slug, user_model=request.user.dealer) date = timezone.now() invoice_model.date_paid = date quotation.date_paid = date @@ -1550,11 +1531,15 @@ class AccountListView(LoginRequiredMixin, ListView): model = AccountModel template_name = "ledger/coa_accounts/account_list.html" context_object_name = "accounts" + paginate_by = 10 def get_queryset(self): entity = self.request.user.dealer.entity qs = entity.get_all_accounts() - return qs + paginator = Paginator(qs,10) + page_number = self.request.GET.get('page', 1) # Default to page 1 + page_obj = paginator.get_page(page_number) + return page_obj class AccountCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView): @@ -1785,4 +1770,17 @@ class EstimatePreviewView(LoginRequiredMixin, DetailView): kwargs["vate_amount"] = (total * vat.vat_rate) kwargs["total"] = (total * vat.vat_rate) + total kwargs["vat"] = vat.rate - return super().get_context_data(**kwargs) \ No newline at end of file + return super().get_context_data(**kwargs) + + +class UserActivityLogListView(ListView): + model = models.UserActivityLog + template_name = 'dealers/activity_log.html' + context_object_name = 'logs' + paginate_by = 10 + + def get_queryset(self): + queryset = super().get_queryset() + if 'user' in self.request.GET: + queryset = queryset.filter(user__email=self.request.GET['user']) + return queryset \ No newline at end of file diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo index fbf63379..363286bd 100644 Binary files a/locale/ar/LC_MESSAGES/django.mo and b/locale/ar/LC_MESSAGES/django.mo differ diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po index 1e1e0483..b19d693f 100644 --- a/locale/ar/LC_MESSAGES/django.po +++ b/locale/ar/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-28 12:56+0300\n" +"POT-Creation-Date: 2024-12-30 09:55+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -19,169 +19,183 @@ 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:182 -#: templates/inventory/car_detail.html:92 templates/inventory/car_form.html:83 -#: templates/inventory/car_inventory.html:35 +#: api/models.py:6 inventory/models.py:183 +#: templates/inventory/car_detail.html:90 templates/inventory/car_form.html:86 +#: templates/inventory/car_inventory.html:29 #: templates/inventory/car_list.html:67 templates/inventory/car_list.html:69 #: templates/sales/quotation_detail.html:72 #: templates/sales/quotation_pdf.html:41 msgid "VIN" msgstr "رقم الهيكل" -#: car_inventory/settings.py:206 +#: car_inventory/settings.py:207 msgid "English" msgstr "الإنجليزية" -#: car_inventory/settings.py:207 +#: car_inventory/settings.py:208 msgid "Arabic" msgstr "العربية" -#: car_inventory/settings.py:267 templates/dashboards/accounting.html:35 +#: car_inventory/settings.py:268 templates/dashboards/accounting.html:35 #: templates/dashboards/accounting.html:39 -#: templates/dealers/dealer_detail.html:140 +#: templates/dealers/dealer_detail.html:130 msgid "SAR" msgstr "ريال سعودي" -#: inventory/forms.py:159 inventory/models.py:395 -#: templates/inventory/car_detail.html:164 +#: inventory/forms.py:166 inventory/models.py:396 +#: templates/inventory/car_detail.html:162 msgid "Custom Date" msgstr "تاريخ البطاقة الجمركية" -#: inventory/forms.py:208 +#: inventory/forms.py:216 msgid "Both exterior and interior colors must be selected." msgstr "يجب اختيار اللونين الخارجي والداخلي." -#: inventory/forms.py:277 +#: inventory/forms.py:285 msgid "You must add an email." msgstr "يجب إضافة بريد إلكتروني." -#: inventory/forms.py:283 +#: inventory/forms.py:291 #: venv/lib/python3.11/site-packages/django_ledger/forms/auth.py:15 msgid "Password" msgstr "كلمة المرور" -#: inventory/forms.py:287 inventory/forms.py:297 inventory/forms.py:344 -#: inventory/forms.py:375 inventory/forms.py:387 +#: inventory/forms.py:295 inventory/forms.py:305 inventory/forms.py:352 +#: inventory/forms.py:383 inventory/forms.py:395 #: venv/lib/python3.11/site-packages/django/forms/fields.py:95 msgid "This field is required." msgstr "هذا الحقل مطلوب." -#: inventory/forms.py:293 +#: inventory/forms.py:301 msgid "Confirm Password" msgstr "تأكيد كلمة المرور" -#: inventory/forms.py:308 +#: inventory/forms.py:316 msgid "You must accept the terms and privacy policy." msgstr "يجب أن تقبل الشروط وسياسة الخصوصية." -#: inventory/forms.py:317 inventory/models.py:524 inventory/models.py:632 +#: inventory/forms.py:325 inventory/models.py:525 inventory/models.py:634 msgid "English Name" msgstr "الاسم بالإنجليزية" -#: inventory/forms.py:321 +#: inventory/forms.py:329 msgid "Please enter an English Name." msgstr "يرجى إدخال اسم باللغة الإنجليزية." -#: inventory/forms.py:327 inventory/models.py:167 inventory/models.py:348 -#: inventory/models.py:361 inventory/models.py:523 inventory/models.py:631 -#: inventory/models.py:688 inventory/models.py:705 +#: inventory/forms.py:335 inventory/models.py:168 inventory/models.py:349 +#: inventory/models.py:362 inventory/models.py:524 inventory/models.py:607 +#: inventory/models.py:633 inventory/models.py:692 inventory/models.py:710 #: templates/users/user_detail.html:48 msgid "Arabic Name" msgstr "الاسم بالعربية" -#: inventory/forms.py:331 +#: inventory/forms.py:339 msgid "Please enter an Arabic name." msgstr "يرجى إدخال اسم باللغة العربية." -#: inventory/forms.py:339 templates/dealers/dealer_detail.html:109 +#: inventory/forms.py:347 templates/dealers/dealer_detail.html:99 #: templates/organizations/organization_detail.html:10 -#: templates/organizations/organization_list.html:20 +#: templates/organizations/organization_list.html:59 #: templates/representatives/representative_detail.html:9 #: templates/representatives/representative_list.html:19 msgid "Phone" msgstr "الهاتف" -#: inventory/forms.py:345 +#: inventory/forms.py:353 msgid "Phone number must be in the format 05xxxxxxxx" msgstr "يجب أن يكون رقم الهاتف بالصيغة 05xxxxxxxx" -#: inventory/forms.py:354 inventory/models.py:516 inventory/models.py:626 -#: inventory/models.py:689 templates/dealers/dealer_detail8.html:31 +#: inventory/forms.py:362 inventory/models.py:517 inventory/models.py:628 +#: inventory/models.py:693 msgid "Commercial Registration Number" msgstr "رقم السجل التجاري" -#: inventory/forms.py:369 inventory/models.py:520 inventory/models.py:629 -#: inventory/models.py:690 templates/dealers/dealer_detail8.html:35 +#: inventory/forms.py:377 inventory/models.py:521 inventory/models.py:631 +#: inventory/models.py:694 msgid "VAT Registration Number" msgstr "رقم التسجيل في ضريبة القيمة المضافة" -#: inventory/forms.py:376 +#: inventory/forms.py:384 msgid "VAT Registration Number must be 15 characters." msgstr "يجب أن يكون رقم التسجيل الضريبي مكونًا من 15 حرفًا." #: inventory/models.py:42 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_item_formset.html:23 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_txs_table.html:9 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/balance_sheet.html:32 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/cash_flow.html:33 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/income_statement.html:28 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:23 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/income_statement.html:11 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_table.html:14 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:11 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/po_item_formset.html:21 +msgid "Unit" +msgstr "الوحدة" + +#: inventory/models.py:43 msgid "Kg" msgstr "كجم" -#: inventory/models.py:43 +#: inventory/models.py:44 msgid "L" msgstr "لتر" -#: inventory/models.py:44 +#: inventory/models.py:45 msgid "m" msgstr "م" -#: inventory/models.py:45 +#: inventory/models.py:46 msgid "cm" msgstr "سم" -#: inventory/models.py:46 +#: inventory/models.py:47 msgid "m2" msgstr "متر مربع" -#: inventory/models.py:47 inventory/models.py:48 +#: inventory/models.py:48 inventory/models.py:49 msgid "m3" msgstr "متر مكعب" -#: inventory/models.py:55 +#: inventory/models.py:56 msgid "logo" msgstr "الشعار" -#: inventory/models.py:146 +#: inventory/models.py:147 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/tags/invoice_item_formset.html:21 msgid "Available" msgstr "متاح" -#: inventory/models.py:147 +#: inventory/models.py:148 msgid "Sold" msgstr "تم البيع" -#: inventory/models.py:148 +#: inventory/models.py:149 msgid "Hold" msgstr "في الانتظار" -#: inventory/models.py:149 +#: inventory/models.py:150 msgid "Damaged" msgstr "تالف" -#: inventory/models.py:150 +#: inventory/models.py:151 msgid "Reserved" msgstr "محجوزة" -#: inventory/models.py:154 +#: inventory/models.py:155 msgid "New" msgstr "جديد" -#: inventory/models.py:155 +#: inventory/models.py:156 msgid "Used" msgstr "مستعمل" -#: inventory/models.py:159 inventory/models.py:416 +#: inventory/models.py:160 inventory/models.py:417 msgid "Owner" msgstr "المالك" -#: inventory/models.py:160 inventory/signals.py:131 templates/base.html:110 -#: templates/base.html:115 templates/header.html:50 +#: inventory/models.py:161 inventory/models.py:595 inventory/signals.py:129 +#: templates/base.html:110 templates/base.html:115 templates/header.html:50 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:440 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:526 #: venv/lib/python3.11/site-packages/django_ledger/models/items.py:521 @@ -189,28 +203,29 @@ msgstr "المالك" msgid "Inventory" msgstr "المخزن" -#: inventory/models.py:161 +#: inventory/models.py:162 msgid "Accountent" msgstr "المحاسب" -#: inventory/models.py:162 +#: inventory/models.py:163 inventory/models.py:597 msgid "Sales" msgstr "المبيعات" -#: inventory/models.py:166 inventory/models.py:347 inventory/models.py:360 -#: inventory/models.py:687 inventory/models.py:704 -#: templates/dealers/dealer_detail8.html:26 -#: templates/organizations/organization_list.html:17 +#: inventory/models.py:167 inventory/models.py:348 inventory/models.py:361 +#: inventory/models.py:606 inventory/models.py:691 inventory/models.py:709 +#: templates/customers/customer_list.html:46 +#: templates/ledger/bank_accounts/bank_account_list.html:51 +#: templates/organizations/organization_list.html:46 #: templates/representatives/representative_list.html:17 #: templates/sales/quotation_detail.html:44 #: templates/sales/quotation_pdf.html:33 templates/users/user_detail.html:47 -#: templates/vendors/vendors_list.html:34 templates/vendors/view_vendor.html:46 +#: templates/vendors/vendors_list.html:46 templates/vendors/view_vendor.html:46 #: venv/lib/python3.11/site-packages/django_ledger/forms/coa.py:16 #: venv/lib/python3.11/site-packages/django_ledger/forms/coa.py:37 msgid "Name" msgstr "الاسم" -#: inventory/models.py:168 inventory/models.py:429 +#: inventory/models.py:169 inventory/models.py:430 #: venv/lib/python3.11/site-packages/django_ledger/forms/coa.py:17 #: venv/lib/python3.11/site-packages/django_ledger/forms/coa.py:38 #: venv/lib/python3.11/site-packages/django_ledger/models/data_import.py:61 @@ -223,30 +238,30 @@ msgstr "الاسم" msgid "Description" msgstr "الوصف" -#: inventory/models.py:169 templates/sales/quotation_detail.html:76 +#: inventory/models.py:170 templates/sales/quotation_detail.html:76 #: templates/sales/quotation_pdf.html:45 msgid "Price" msgstr "السعر" -#: inventory/models.py:170 +#: inventory/models.py:171 msgid "taxable" msgstr "خاضع للضريبة" -#: inventory/models.py:171 +#: inventory/models.py:172 msgid "Unit of Measurement" msgstr "وحدة القياس" -#: inventory/models.py:172 inventory/models.py:184 inventory/models.py:568 +#: inventory/models.py:173 inventory/models.py:185 inventory/models.py:569 msgid "Dealer" msgstr "المعرض" -#: inventory/models.py:175 inventory/models.py:176 +#: inventory/models.py:176 inventory/models.py:177 msgid "Additional Services" msgstr "الخدمات الإضافية" -#: inventory/models.py:193 inventory/models.py:643 -#: templates/inventory/car_detail.html:138 -#: templates/inventory/car_form.html:230 +#: inventory/models.py:194 inventory/models.py:647 +#: templates/inventory/car_detail.html:136 +#: templates/inventory/car_form.html:233 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:359 #: 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 @@ -254,33 +269,34 @@ msgstr "الخدمات الإضافية" msgid "Vendor" msgstr "المورد" -#: inventory/models.py:201 +#: inventory/models.py:202 msgid "Make" msgstr "الصانع" -#: inventory/models.py:209 templates/sales/quotation_detail.html:73 +#: inventory/models.py:210 templates/sales/quotation_detail.html:73 #: templates/sales/quotation_pdf.html:42 msgid "Model" msgstr "الموديل" -#: inventory/models.py:211 templates/inventory/car_form.html:118 -#: templates/inventory/car_inventory.html:36 +#: inventory/models.py:212 templates/inventory/car_form.html:121 +#: templates/inventory/car_inventory.html:30 #: templates/sales/quotation_detail.html:74 #: templates/sales/quotation_pdf.html:43 msgid "Year" msgstr "السنة" -#: inventory/models.py:218 templates/inventory/car_form.html:182 +#: inventory/models.py:219 templates/inventory/car_form.html:185 msgid "Series" msgstr "السلسلة" -#: inventory/models.py:226 +#: inventory/models.py:227 msgid "Trim" msgstr "الفئة" -#: inventory/models.py:232 inventory/models.py:746 -#: templates/inventory/car_detail.html:116 +#: inventory/models.py:233 inventory/models.py:752 +#: templates/inventory/car_detail.html:114 #: templates/inventory/car_list.html:163 +#: templates/sales/estimates/estimate_list.html:17 #: templates/sales/quotation_detail.html:54 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_table.html:10 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/card_estimate.html:12 @@ -291,274 +307,301 @@ msgstr "الفئة" msgid "Status" msgstr "الحالة" -#: inventory/models.py:238 templates/inventory/car_detail.html:120 -#: templates/inventory/car_form.html:248 templates/inventory/car_list.html:177 +#: inventory/models.py:239 templates/inventory/car_detail.html:118 +#: templates/inventory/car_form.html:251 templates/inventory/car_list.html:177 msgid "Stock Type" msgstr "نوع المخزون" -#: inventory/models.py:240 inventory/models.py:743 -#: templates/inventory/car_detail.html:143 -#: templates/inventory/car_form.html:301 templates/inventory/car_list.html:200 +#: inventory/models.py:241 inventory/models.py:749 +#: templates/inventory/car_detail.html:141 +#: templates/inventory/car_form.html:304 templates/inventory/car_list.html:200 #: templates/sales/quotation_detail.html:53 msgid "Remarks" msgstr "ملاحظات" -#: inventory/models.py:241 templates/inventory/car_detail.html:124 -#: templates/inventory/car_form.html:265 templates/inventory/car_list.html:191 +#: inventory/models.py:242 templates/inventory/car_detail.html:122 +#: templates/inventory/car_form.html:268 templates/inventory/car_list.html:191 #: templates/inventory/car_list.html:192 msgid "Mileage" msgstr "عدد الكيلومترات" -#: inventory/models.py:242 templates/inventory/car_detail.html:128 -#: templates/inventory/car_form.html:283 +#: inventory/models.py:243 templates/inventory/car_detail.html:126 +#: templates/inventory/car_form.html:286 msgid "Receiving Date" msgstr "تاريخ الاستلام" -#: inventory/models.py:245 inventory/models.py:286 inventory/models.py:393 -#: inventory/models.py:410 inventory/models.py:460 inventory/models.py:824 -#: inventory/signals.py:244 templates/sales/sales_order_detail.html:24 +#: inventory/models.py:246 inventory/models.py:287 inventory/models.py:394 +#: inventory/models.py:411 inventory/models.py:461 inventory/models.py:830 +#: templates/sales/sales_order_detail.html:24 msgid "Car" msgstr "السيارة" -#: inventory/models.py:246 templates/base.html:124 +#: inventory/models.py:247 templates/base.html:124 +#: templates/customers/view_customer.html:121 msgid "Cars" msgstr "السيارات" -#: inventory/models.py:287 templates/inventory/car_detail.html:328 +#: inventory/models.py:288 templates/inventory/car_detail.html:326 msgid "Reserved By" msgstr "محجوز بواسطة" -#: inventory/models.py:288 +#: inventory/models.py:289 msgid "Reserved At" msgstr "تاريخ الحجز" -#: inventory/models.py:289 +#: inventory/models.py:290 msgid "Reserved Until" msgstr "محجوز حتى" -#: inventory/models.py:297 templates/inventory/car_detail.html:38 +#: inventory/models.py:298 templates/inventory/car_detail.html:38 msgid "Car Reservation" msgstr "حجز السيارة" -#: inventory/models.py:298 +#: inventory/models.py:299 msgid "Car Reservations" msgstr "حجوزات السيارات" -#: inventory/models.py:304 templates/inventory/car_detail.html:219 +#: inventory/models.py:305 templates/inventory/car_detail.html:217 msgid "Cost Price" msgstr "سعر التكلفة" -#: inventory/models.py:305 templates/inventory/car_detail.html:224 +#: inventory/models.py:306 templates/inventory/car_detail.html:222 #: templates/sales/sales_order_detail.html:25 msgid "Selling Price" msgstr "سعر البيع" -#: inventory/models.py:306 templates/inventory/car_detail.html:228 +#: inventory/models.py:307 templates/inventory/car_detail.html:226 msgid "Discount Amount" msgstr "مبلغ الخصم" -#: inventory/models.py:343 inventory/models.py:344 +#: inventory/models.py:344 inventory/models.py:345 msgid "Car Financial Details" msgstr "تفاصيل المالية للسيارة" -#: inventory/models.py:349 inventory/models.py:362 +#: inventory/models.py:350 inventory/models.py:363 msgid "RGB" msgstr "آر جي بي" -#: inventory/models.py:352 inventory/models.py:353 +#: inventory/models.py:353 inventory/models.py:354 #: templates/inventory/add_colors.html:13 msgid "Exterior Colors" msgstr "الألوان الخارجية" -#: inventory/models.py:365 inventory/models.py:366 +#: inventory/models.py:366 inventory/models.py:367 #: templates/inventory/add_colors.html:32 msgid "Interior Colors" msgstr "الألوان الداخلية" -#: inventory/models.py:383 +#: inventory/models.py:384 msgid "Color" msgstr "اللون" -#: inventory/models.py:384 +#: inventory/models.py:385 msgid "Colors" msgstr "الألوان" -#: inventory/models.py:394 templates/inventory/car_detail.html:160 +#: inventory/models.py:395 templates/inventory/car_detail.html:158 msgid "Custom Number" msgstr "رقم البطاقة الجمركية" -#: inventory/models.py:398 templates/inventory/car_detail.html:23 -#: templates/inventory/car_detail.html:169 +#: inventory/models.py:399 templates/inventory/car_detail.html:23 +#: templates/inventory/car_detail.html:167 msgid "Custom Card" msgstr "البطاقة الجمركية" -#: inventory/models.py:399 +#: inventory/models.py:400 msgid "Custom Cards" msgstr "البطاقات الجمركية" -#: inventory/models.py:417 +#: inventory/models.py:418 msgid "Dealer who owns the car." msgstr "التاجر الذي يمتلك السيارة." -#: inventory/models.py:423 +#: inventory/models.py:424 msgid "Showroom" msgstr "صالة العرض" -#: inventory/models.py:424 +#: inventory/models.py:425 msgid "Dealer where the car is displayed (can be the owner)." msgstr "التاجر الذي تُعرض السيارة في صالته (يمكن أن يكون المالك)." -#: inventory/models.py:430 +#: inventory/models.py:431 msgid "Optional description about the showroom placement." msgstr "وصف اختياري حول وضع السيارة في صالة العرض." -#: inventory/models.py:434 inventory/models.py:748 inventory/models.py:880 +#: inventory/models.py:435 inventory/models.py:610 inventory/models.py:644 +#: inventory/models.py:698 inventory/models.py:754 inventory/models.py:886 #: templates/sales/quotation_list.html:18 msgid "Created At" msgstr "تاريخ الإنشاء" -#: inventory/models.py:438 +#: inventory/models.py:439 msgid "Last Updated" msgstr "آخر تحديث" -#: inventory/models.py:442 +#: inventory/models.py:443 msgid "Car Location" msgstr "موقع السيارة" -#: inventory/models.py:443 +#: inventory/models.py:444 msgid "Car Locations" msgstr "مواقف السيارات" -#: inventory/models.py:462 +#: inventory/models.py:463 msgid "Plate Number" msgstr "رقم اللوحة" -#: inventory/models.py:463 +#: inventory/models.py:464 msgid "Text 1" msgstr "النص 1" -#: inventory/models.py:464 +#: inventory/models.py:465 msgid "Text 2" msgstr "النص 2" -#: inventory/models.py:465 +#: inventory/models.py:466 msgid "Text 3" msgstr "النص 3" -#: inventory/models.py:466 +#: inventory/models.py:467 msgid "Registration Date" msgstr "تاريخ التسجيل" -#: inventory/models.py:469 +#: inventory/models.py:470 msgid "Registration" msgstr "التسجيل" -#: inventory/models.py:470 +#: inventory/models.py:471 msgid "Registrations" msgstr "تسجيل السيارات" -#: inventory/models.py:478 inventory/models.py:670 +#: inventory/models.py:479 inventory/models.py:674 +#: templates/sales/estimates/estimate_list.html:19 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:38 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_table.html:12 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/ledger/tags/ledgers_table.html:17 msgid "Created" msgstr "تاريخ الإنشاء" -#: inventory/models.py:479 +#: inventory/models.py:480 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:41 msgid "Updated" msgstr "تم التحديث" -#: inventory/models.py:525 inventory/models.py:634 inventory/models.py:665 -#: inventory/models.py:691 inventory/models.py:707 -#: templates/customers/view_customer.html:53 -#: templates/dealers/dealer_detail8.html:40 +#: inventory/models.py:526 inventory/models.py:608 inventory/models.py:636 +#: inventory/models.py:669 inventory/models.py:695 inventory/models.py:712 +#: templates/customers/customer_list.html:54 +#: templates/customers/view_customer.html:104 #: templates/sales/invoice/invoice_detail.html:53 #: templates/users/user_detail.html:51 templates/vendors/view_vendor.html:52 #: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:113 msgid "Phone Number" msgstr "رقم الهاتف" -#: inventory/models.py:529 inventory/models.py:636 inventory/models.py:668 -#: inventory/models.py:692 inventory/models.py:708 -#: templates/customers/view_customer.html:54 -#: templates/dealers/dealer_detail.html:93 -#: templates/dealers/dealer_detail8.html:44 +#: inventory/models.py:530 inventory/models.py:639 inventory/models.py:672 +#: inventory/models.py:696 inventory/models.py:714 +#: templates/customers/customer_list.html:64 +#: templates/customers/view_customer.html:99 +#: templates/dealers/dealer_detail.html:83 #: templates/organizations/organization_detail.html:11 +#: templates/organizations/organization_list.html:64 #: templates/representatives/representative_detail.html:10 #: templates/sales/invoice/invoice_detail.html:54 #: templates/sales/quotation_detail.html:46 -#: templates/sales/quotation_pdf.html:34 templates/users/user_detail.html:52 -#: templates/vendors/vendors_list.html:36 templates/vendors/view_vendor.html:58 +#: templates/sales/quotation_pdf.html:34 templates/vendors/vendors_list.html:64 +#: templates/vendors/view_vendor.html:58 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/customer/tags/customer_table.html:10 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/vendor/tags/vendor_table.html:11 msgid "Address" msgstr "العنوان" -#: inventory/models.py:533 inventory/models.py:639 inventory/models.py:693 -#: templates/vendors/vendors_list.html:35 +#: inventory/models.py:534 inventory/models.py:642 inventory/models.py:697 msgid "Logo" msgstr "الشعار" -#: inventory/models.py:535 +#: inventory/models.py:536 msgid "Joined At" msgstr "انضم في" -#: inventory/models.py:540 -msgid "Parent Dealer" -msgstr "المعرض الرئيسي" +#: inventory/models.py:537 inventory/models.py:611 inventory/models.py:755 +msgid "Updated At" +msgstr "تم التحديث" -#: inventory/models.py:544 -msgid "Dealer Type" -msgstr "نوع المعرض" - -#: inventory/models.py:569 +#: inventory/models.py:570 msgid "Dealers" msgstr "المعارض" -#: inventory/models.py:633 templates/vendors/view_vendor.html:49 +#: inventory/models.py:594 +#: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:3190 +msgid "Manager" +msgstr "مدير" + +#: inventory/models.py:596 +msgid "Accountant" +msgstr "محاسب" + +#: inventory/models.py:598 +msgid "Receptionist" +msgstr "إستقبال" + +#: inventory/models.py:599 +msgid "Technician" +msgstr "فني" + +#: inventory/models.py:600 +msgid "Driver" +msgstr "سائق" + +#: inventory/models.py:609 +msgid "Staff Type" +msgstr "نوع الموظف" + +#: inventory/models.py:614 inventory/models.py:615 templates/base.html:468 +msgid "Staff" +msgstr "الموظفون" + +#: inventory/models.py:635 templates/vendors/view_vendor.html:49 msgid "Contact Person" msgstr "الشخص المسؤول" -#: inventory/models.py:644 templates/header.html:158 templates/header.html:173 -#: templates/vendors/vendor_form.html:4 templates/vendors/vendors_list.html:4 -#: templates/vendors/vendors_list.html:5 templates/vendors/vendors_list.html:11 +#: inventory/models.py:637 inventory/models.py:713 +msgid "Email Address" +msgstr "عنوان البريد الإلكتروني" + +#: inventory/models.py:648 templates/base.html:135 templates/header.html:158 +#: templates/header.html:173 templates/vendors/vendor_form.html:4 +#: templates/vendors/vendors_list.html:4 templates/vendors/vendors_list.html:5 +#: templates/vendors/vendors_list.html:12 msgid "Vendors" msgstr "الموردين" -#: inventory/models.py:655 templates/customers/customer_list.html:51 -#: templates/customers/view_customer.html:46 -#: templates/sales/invoice/invoice_detail.html:46 +#: inventory/models.py:659 templates/sales/invoice/invoice_detail.html:46 msgid "First Name" msgstr "الاسم الأول" -#: inventory/models.py:657 templates/customers/customer_list.html:52 -#: templates/customers/view_customer.html:47 -#: templates/sales/invoice/invoice_detail.html:47 +#: inventory/models.py:661 templates/sales/invoice/invoice_detail.html:47 msgid "Middle Name" msgstr "اسم الأب" -#: inventory/models.py:659 templates/customers/customer_list.html:53 -#: templates/customers/view_customer.html:48 -#: templates/sales/invoice/invoice_detail.html:48 +#: inventory/models.py:663 templates/sales/invoice/invoice_detail.html:48 msgid "Last Name" msgstr "اسم العائلة" -#: inventory/models.py:660 templates/customers/view_customer.html:51 -#: templates/dealers/dealer_detail.html:103 +#: inventory/models.py:664 templates/customers/view_customer.html:102 +#: templates/dealers/dealer_detail.html:93 #: templates/sales/invoice/invoice_detail.html:51 #: templates/vendors/view_vendor.html:55 #: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:111 msgid "Email" msgstr "البريد الإلكتروني" -#: inventory/models.py:662 templates/customers/customer_list.html:54 -#: templates/customers/view_customer.html:52 +#: inventory/models.py:666 templates/customers/customer_list.html:59 #: templates/sales/invoice/invoice_detail.html:52 msgid "National ID" msgstr "رقم الهوية الوطنية" -#: inventory/models.py:673 inventory/models.py:735 +#: inventory/models.py:677 inventory/models.py:741 +#: templates/sales/estimates/estimate_list.html:16 #: templates/sales/quotation_list.html:15 #: templates/sales/sales_order_detail.html:12 #: venv/lib/python3.11/site-packages/django_ledger/models/customer.py:199 @@ -569,37 +612,42 @@ msgstr "رقم الهوية الوطنية" msgid "Customer" msgstr "العميل" -#: inventory/models.py:674 templates/customers/customer_list.html:3 -#: templates/customers/customer_list.html:6 +#: inventory/models.py:678 templates/customers/customer_form.html:4 +#: templates/customers/customer_list.html:4 +#: templates/customers/customer_list.html:5 +#: templates/customers/customer_list.html:12 +#: templates/ledger/bank_accounts/bank_account_list.html:6 msgid "Customers" msgstr "العملاء" -#: inventory/models.py:696 +#: inventory/models.py:701 msgid "Organization" -msgstr "منظمة" +msgstr "شركة" -#: inventory/models.py:697 templates/organizations/organization_list.html:3 -#: templates/organizations/organization_list.html:6 +#: inventory/models.py:702 templates/base.html:184 templates/base.html:189 +#: templates/base.html:198 templates/organizations/organization_list.html:4 +#: templates/organizations/organization_list.html:5 +#: templates/organizations/organization_list.html:12 msgid "Organizations" -msgstr "منظمات" +msgstr "الشركات" -#: inventory/models.py:706 +#: inventory/models.py:711 #: templates/representatives/representative_detail.html:8 #: templates/representatives/representative_list.html:18 msgid "ID Number" msgstr "رقم الهوية" -#: inventory/models.py:712 +#: inventory/models.py:718 msgid "Representative" -msgstr "ممثل" +msgstr "ممثل شركة" -#: inventory/models.py:713 templates/base.html:186 templates/header.html:121 +#: inventory/models.py:719 templates/base.html:210 templates/header.html:121 #: templates/representatives/representative_list.html:3 #: templates/representatives/representative_list.html:6 msgid "Representatives" -msgstr "ممثلون" +msgstr "ممثلي الشركات" -#: inventory/models.py:723 +#: inventory/models.py:729 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:338 #: venv/lib/python3.11/site-packages/django_ledger/models/estimate.py:223 #: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:299 @@ -607,7 +655,7 @@ msgstr "ممثلون" msgid "Draft" msgstr "مسودة" -#: inventory/models.py:724 +#: inventory/models.py:730 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:340 #: venv/lib/python3.11/site-packages/django_ledger/models/estimate.py:225 #: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:301 @@ -616,7 +664,7 @@ msgstr "مسودة" msgid "Approved" msgstr "تمت الموافقة" -#: inventory/models.py:725 +#: inventory/models.py:731 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:339 #: venv/lib/python3.11/site-packages/django_ledger/models/estimate.py:224 #: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:300 @@ -624,28 +672,25 @@ msgstr "تمت الموافقة" msgid "In Review" msgstr "قيد المراجعة" -#: inventory/models.py:726 +#: inventory/models.py:732 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:341 #: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:302 msgid "Paid" msgstr "مدفوع" -#: inventory/models.py:741 +#: inventory/models.py:747 +#: templates/ledger/bank_accounts/bank_account_detail.html:50 #: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:491 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/po_item_formset.html:22 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/tags/po_item_table.html:11 msgid "Amount" msgstr "المبلغ" -#: inventory/models.py:749 -msgid "Updated At" -msgstr "تم التحديث" - -#: inventory/models.py:752 +#: inventory/models.py:758 msgid "Payment ID" msgstr "معرف الدفع" -#: inventory/models.py:754 +#: inventory/models.py:760 #: venv/lib/python3.11/site-packages/django_ledger/forms/bill.py:49 #: venv/lib/python3.11/site-packages/django_ledger/forms/invoice.py:64 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:375 @@ -655,14 +700,14 @@ msgstr "معرف الدفع" msgid "Draft Date" msgstr "تاريخ المسودة" -#: inventory/models.py:755 +#: inventory/models.py:761 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:376 #: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:349 #: venv/lib/python3.11/site-packages/django_ledger/models/purchase_order.py:220 msgid "In Review Date" msgstr "تاريخ المراجعة" -#: inventory/models.py:756 +#: inventory/models.py:762 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:377 #: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:350 #: venv/lib/python3.11/site-packages/django_ledger/models/purchase_order.py:221 @@ -670,7 +715,7 @@ msgstr "تاريخ المراجعة" msgid "Approved Date" msgstr "تاريخ الموافقة" -#: inventory/models.py:757 +#: inventory/models.py:763 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:378 #: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:351 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/includes/card_bill.html:138 @@ -678,25 +723,25 @@ msgstr "تاريخ الموافقة" msgid "Paid Date" msgstr "تاريخ الدفع" -#: inventory/models.py:758 +#: inventory/models.py:764 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:379 #: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:352 #: venv/lib/python3.11/site-packages/django_ledger/models/purchase_order.py:222 msgid "Void Date" msgstr "تاريخ الإبطال" -#: inventory/models.py:759 +#: inventory/models.py:765 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:380 #: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:353 #: venv/lib/python3.11/site-packages/django_ledger/models/purchase_order.py:224 msgid "Canceled Date" msgstr "تاريخ الإلغاء" -#: inventory/models.py:819 inventory/models.py:878 +#: inventory/models.py:825 inventory/models.py:884 msgid "Quotation" msgstr "عزرص سعر" -#: inventory/models.py:826 templates/sales/quotation_detail.html:75 +#: inventory/models.py:832 templates/sales/quotation_detail.html:75 #: templates/sales/quotation_pdf.html:44 #: venv/lib/python3.11/site-packages/django_ledger/models/items.py:1068 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/bill_detail.html:97 @@ -710,113 +755,112 @@ msgstr "عزرص سعر" msgid "Quantity" msgstr "الكمية" -#: inventory/models.py:882 templates/sales/quotation_list.html:17 +#: inventory/models.py:888 templates/sales/quotation_list.html:17 #: templates/sales/sales_order_detail.html:16 #: templates/sales/sales_order_detail.html:27 msgid "Total Amount" msgstr "المبلغ الإجمالي" -#: inventory/models.py:891 +#: inventory/models.py:897 msgid "cash" msgstr "نقداً" -#: inventory/models.py:892 +#: inventory/models.py:898 msgid "credit" msgstr "دائن" -#: inventory/models.py:893 templates/inventory/car_detail.html:191 -#: templates/inventory/car_detail.html:385 +#: inventory/models.py:899 templates/inventory/car_detail.html:189 #: templates/inventory/transfer_car.html:23 msgid "transfer" msgstr "نقل" -#: inventory/models.py:894 +#: inventory/models.py:900 msgid "debit" msgstr "مدين" -#: inventory/models.py:895 +#: inventory/models.py:901 msgid "SADAD" msgstr "سداد" -#: inventory/models.py:898 inventory/models.py:920 +#: inventory/models.py:904 inventory/models.py:926 msgid "amount" msgstr "المبلغ" -#: inventory/models.py:899 +#: inventory/models.py:905 msgid "method" msgstr "طريقة" -#: inventory/models.py:900 +#: inventory/models.py:906 msgid "reference number" msgstr "رقم المرجع" -#: inventory/models.py:901 +#: inventory/models.py:907 msgid "date" msgstr "التاريخ" -#: inventory/models.py:911 +#: inventory/models.py:917 msgid "payment" msgstr "الدفعة" -#: inventory/models.py:912 templates/base.html:229 +#: inventory/models.py:918 templates/base.html:253 msgid "payments" msgstr "المدفوعات" -#: inventory/models.py:921 +#: inventory/models.py:927 msgid "reason" msgstr "السبب" -#: inventory/models.py:922 +#: inventory/models.py:928 msgid "refund date" msgstr "تاريخ الاسترداد" -#: inventory/models.py:925 +#: inventory/models.py:931 msgid "refund" msgstr "استرداد" -#: inventory/models.py:926 +#: inventory/models.py:932 msgid "refunds" msgstr "استردادات" -#: inventory/signals.py:111 +#: inventory/signals.py:109 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/includes/widget_bs.html:14 msgid "Cash" msgstr "نقداً" -#: inventory/signals.py:121 +#: inventory/signals.py:119 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/invoice_detail.html:41 msgid "Accounts Receivable" msgstr "الحسابات المدينة" -#: inventory/signals.py:141 +#: inventory/signals.py:139 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:466 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:552 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/bill_detail.html:52 msgid "Accounts Payable" msgstr "الحسابات الدائنة" -#: inventory/signals.py:151 +#: inventory/signals.py:148 +msgid "Partners Current" +msgstr "جاري الشركاء" + +#: inventory/signals.py:158 msgid "Sales Revenue" msgstr "إيرادات المبيعات" -#: inventory/signals.py:161 +#: inventory/signals.py:168 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:497 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:587 msgid "Cost of Goods Sold" msgstr "تكلفة البضائع المباعة" -#: inventory/signals.py:171 +#: inventory/signals.py:178 msgid "Rent Expense" msgstr "مصروف الإيجار" -#: inventory/signals.py:181 +#: inventory/signals.py:188 msgid "Utilities Expense" msgstr "مصروف الخدمات" -#: inventory/signals.py:245 -msgid "C" -msgstr "ج" - #: inventory/utils.py:28 msgid "success" msgstr "ناجحة" @@ -825,123 +869,118 @@ msgstr "ناجحة" msgid "error" msgstr "خطأ" -#: inventory/utils.py:30 templates/account/password_change.html:22 +#: inventory/utils.py:30 templates/account/password_change.html:27 msgid "Forgot Password?" msgstr "نسيت كلمة المرور؟" -#: inventory/views.py:323 templates/dashboards/accounting.html:21 +#: inventory/views.py:341 templates/dashboards/accounting.html:21 #: templates/header.html:33 templates/inventory/car_inventory.html:4 #: templates/inventory/car_inventory.html:7 msgid "inventory" msgstr "المخزون" -#: inventory/views.py:465 +#: inventory/views.py:483 msgid "Car finance details saved successfully." msgstr "تم حفظ تفاصيل المالية للسيارة بنجاح." -#: inventory/views.py:481 +#: inventory/views.py:499 msgid "Car finance details updated successfully." msgstr "تم تحديث تفاصيل المالية للسيارة بنجاح." -#: inventory/views.py:496 +#: inventory/views.py:514 msgid "Car updated successfully." msgstr "تم تحديث السيارة بنجاح" -#: inventory/views.py:508 +#: inventory/views.py:526 msgid "Car deleted successfully." msgstr "تم حذف السيارة بنجاح." -#: inventory/views.py:553 +#: inventory/views.py:571 msgid "Custom Card added successfully." msgstr "تم إضافة البطاقة الجمركية بنجاح." -#: inventory/views.py:562 +#: inventory/views.py:580 msgid "This car is already reserved." msgstr "هذه السيارة محجوزة بالفعل." -#: inventory/views.py:570 +#: inventory/views.py:588 msgid "Car reserved successfully." msgstr "تم حجز السيارة بنجاح." -#: inventory/views.py:591 +#: inventory/views.py:609 msgid "Reservation renewed successfully." msgstr "تم تجديد الحجز بنجاح" -#: inventory/views.py:596 +#: inventory/views.py:614 msgid "Reservation canceled successfully." msgstr "تم إلغاء الحجز بنجاح." -#: inventory/views.py:601 +#: inventory/views.py:619 msgid "Invalid action." msgstr "إجراء غير صالح." -#: inventory/views.py:605 +#: inventory/views.py:623 msgid "Invalid request method." msgstr "طريقة الطلب غير صالحة" -#: inventory/views.py:620 +#: inventory/views.py:645 msgid "Dealer updated successfully." msgstr "تم تحديث المعرض بنجاح." -#: inventory/views.py:640 templates/base.html:135 templates/base.html:140 -#: templates/base.html:149 templates/customers/customer_form.html:4 -#: templates/header.html:62 templates/header.html:77 +#: inventory/views.py:665 templates/base.html:159 templates/base.html:164 +#: templates/base.html:173 templates/header.html:62 templates/header.html:77 msgid "customers" msgstr "العملاء" -#: inventory/views.py:684 +#: inventory/views.py:709 msgid "Customer created successfully." msgstr "تم إنشاء العميل بنجاح." -#: inventory/views.py:698 +#: inventory/views.py:728 msgid "Customer updated successfully." msgstr "تم تحديث العميل بنجاح." -#: inventory/views.py:705 +#: inventory/views.py:735 msgid "Customer deleted successfully." msgstr "تم حذف العميل بنجاح." -#: inventory/views.py:734 +#: inventory/views.py:764 msgid "Vendor created successfully." msgstr "تم إنشاء المورد بنجاح." -#: inventory/views.py:748 +#: inventory/views.py:784 msgid "Vendor updated successfully." msgstr "تم تحديث المورد بنجاح" -#: inventory/views.py:755 +#: inventory/views.py:791 msgid "Vendor deleted successfully." msgstr "تم حذف المورد بنجاح." -#: inventory/views.py:778 +#: inventory/views.py:814 msgid "Quotation created successfully." msgstr "تم إنشاء عرض السعر بنجاح." -#: inventory/views.py:1043 +#: inventory/views.py:1079 msgid "Quotation Approved" msgstr "تمت الموافقة على العرض" -#: inventory/views.py:1060 +#: inventory/views.py:1096 msgid "Quotation Paid" msgstr "تم دفع العرض" -#: inventory/views.py:1068 +#: inventory/views.py:1104 msgid "Quotation already approved." msgstr "تمت الموافقة على العرض بالفعل." -#: inventory/views.py:1083 +#: inventory/views.py:1119 msgid "Quotation confirmed and sales order created." msgstr "تم تأكيد عرض السعر وإنشاء أمر البيع." -#: inventory/views.py:1138 +#: inventory/views.py:1162 msgid "User created successfully." msgstr "تم إنشاء المستخدم بنجاح." -#: inventory/views.py:1151 -msgid "You have reached the maximum number of users." -msgstr "لقد وصلت إلى الحد الأقصى لعدد المستخدمين." - -#: inventory/views.py:1180 +#: inventory/views.py:1189 msgid "User updated successfully." msgstr "تم تحديث المستخدم بنجاح" @@ -949,32 +988,37 @@ msgstr "تم تحديث المستخدم بنجاح" msgid "User deleted successfully." msgstr "تم حذف المستخدم بنجاح." -#: templates/account/login.html:6 templates/account/login.html:16 -#: templates/account/login.html:28 templates/account/signup.html:75 -#: templates/base.html:462 templates/header.html:233 templates/index.html:96 +#: templates/account/login.html:6 templates/account/login.html:21 +#: templates/account/login.html:33 templates/account/signup.html:79 +#: templates/base.html:483 templates/header.html:233 templates/welcome.html:90 msgid "Sign In" msgstr "تسجيل الدخول" -#: templates/account/login.html:13 templates/account/password_change.html:10 -#: templates/account/password_reset.html:10 -#: templates/account/signup-wizard.html:10 templates/header.html:25 -#: templates/header.html:210 templates/index.html:84 +#: templates/account/login.html:15 templates/account/login.html:16 +#: templates/account/password_change.html:12 +#: templates/account/password_change.html:13 +#: templates/account/password_reset.html:12 +#: templates/account/password_reset.html:13 +#: templates/account/signup-wizard.html:11 +#: templates/account/signup-wizard.html:12 templates/account/signup.html:13 +#: templates/account/signup.html:14 templates/header.html:25 +#: templates/header.html:210 templates/welcome.html:78 msgid "home" msgstr "الرئيسية" -#: templates/account/login.html:33 +#: templates/account/login.html:38 msgid "If you have not created an account yet, then please" msgstr "إذا لم تقم بإنشاء حساب بعد، يرجى التسجيل أولاً." -#: templates/account/login.html:33 templates/account/signup-wizard.html:14 -#: templates/account/signup.html:5 templates/account/signup.html:74 -#: templates/base.html:463 templates/index.html:96 +#: templates/account/login.html:38 templates/account/signup-wizard.html:16 +#: templates/account/signup.html:5 templates/account/signup.html:78 +#: templates/base.html:484 templates/welcome.html:90 msgid "Sign Up" msgstr "إنشاء حساب" #: templates/account/logout.html:3 templates/account/logout.html:11 -#: templates/account/logout.html:20 templates/base.html:459 -#: templates/dealers/dealer_detail8.html:65 templates/header.html:227 +#: templates/account/logout.html:20 templates/base.html:480 +#: templates/header.html:227 msgid "Sign Out" msgstr "تسجيل الخروج" @@ -983,33 +1027,32 @@ msgid "Are you sure you want to sign out?" msgstr "هل أنت متأكد أنك تريد تسجيل الخروج؟" #: templates/account/password_change.html:3 -#: templates/account/password_change.html:13 -#: templates/account/password_change.html:26 -#: templates/dealers/dealer_detail.html:29 -#: templates/dealers/dealer_detail8.html:60 +#: templates/account/password_change.html:18 +#: templates/account/password_change.html:31 +#: templates/dealers/dealer_detail.html:21 msgid "Change Password" msgstr "تغيير كلمة المرور" -#: templates/account/password_change.html:14 +#: templates/account/password_change.html:19 msgid "Ensure your account is using a strong, unique password." msgstr "تأكد من أن حسابك يستخدم كلمة مرور قوية وفريدة." #: templates/account/password_reset.html:4 -#: templates/account/password_reset.html:14 +#: templates/account/password_reset.html:18 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "إعادة تعيين كلمة المرور" -#: templates/account/password_reset.html:15 +#: templates/account/password_reset.html:19 msgid "Type your new password" msgstr "أدخل كلمة المرور الجديدة" -#: templates/account/password_reset.html:29 +#: templates/account/password_reset.html:33 msgid "Reset My Password" msgstr "إعادة تعيين كلمة المرور الخاصة بي" -#: templates/account/password_reset.html:32 +#: templates/account/password_reset.html:36 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "يرجى التواصل معنا إذا واجهت أي مشكلة في إعادة تعيين كلمة المرور الخاصة بك." @@ -1022,15 +1065,15 @@ msgstr "" "لقد أرسلنا لك رسالة بريد إلكتروني. إذا لم تتلقاها، يرجى التحقق من مجلد " "البريد الغير هام. وإذا لم تصلك في غضون بضع دقائق، يرجى التواصل معنا." -#: templates/account/signup-wizard.html:15 +#: templates/account/signup-wizard.html:17 msgid "Create your account today" msgstr "أنشئ حسابك اليوم" -#: templates/account/signup-wizard.html:22 +#: templates/account/signup-wizard.html:24 msgid "Access" msgstr "الوصول" -#: templates/account/signup-wizard.html:25 +#: templates/account/signup-wizard.html:27 #: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:443 #: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:485 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bank_account/bank_account_update.html:13 @@ -1040,71 +1083,66 @@ msgstr "الوصول" msgid "Account" msgstr "الحساب" -#: templates/account/signup-wizard.html:28 +#: templates/account/signup-wizard.html:30 msgid "Extra" msgstr "إضافي" -#: templates/account/signup-wizard.html:31 +#: templates/account/signup-wizard.html:33 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/je_detail_txs.html:59 msgid "Done" msgstr "تم" -#: templates/account/signup-wizard.html:59 +#: templates/account/signup-wizard.html:61 msgid "You are all set!" msgstr "كل شيء جاهز!" -#: templates/account/signup-wizard.html:60 +#: templates/account/signup-wizard.html:62 msgid "Now you can access your account" msgstr "الآن يمكنك الوصول إلى حسابك" -#: templates/account/signup-wizard.html:60 +#: templates/account/signup-wizard.html:62 msgid "anytime" msgstr "في أي وقت" -#: templates/account/signup-wizard.html:60 +#: templates/account/signup-wizard.html:62 msgid "anywhere" msgstr "في أي مكان" -#: templates/account/signup-wizard.html:60 +#: templates/account/signup-wizard.html:62 msgid "Submit" msgstr "إرسال" -#: templates/account/signup-wizard.html:69 -#: templates/customers/customer_list.html:89 +#: templates/account/signup-wizard.html:71 +#: templates/ledger/bank_accounts/bank_account_list.html:85 #: venv/lib/python3.11/site-packages/alabaster/relations.html:9 msgid "Previous" msgstr "السابق" -#: templates/account/signup-wizard.html:71 -#: templates/customers/customer_list.html:111 +#: templates/account/signup-wizard.html:73 +#: templates/ledger/bank_accounts/bank_account_list.html:107 #: venv/lib/python3.11/site-packages/alabaster/relations.html:13 msgid "Next" msgstr "التالي" -#: templates/account/signup-wizard.html:147 -#: templates/inventory/car_form.html:618 +#: templates/account/signup-wizard.html:149 +#: templates/inventory/car_form.html:621 msgid "Please Wait" msgstr "الرجاء الإنتظار" -#: templates/account/signup-wizard.html:148 -#: templates/inventory/car_form.html:619 +#: templates/account/signup-wizard.html:150 +#: templates/inventory/car_form.html:622 msgid "Loading" msgstr "تحميل" -#: templates/account/signup.html:11 templates/base.html:259 -#: templates/index.html:61 -msgid "Haikal" -msgstr "هيكل" - -#: templates/account/signup.html:23 +#: templates/account/signup.html:27 msgid "Sign up using a passkey" msgstr "إنشاء حساب باستخدام مفتاح المرور" -#: templates/account/signup.html:75 +#: templates/account/signup.html:79 msgid "Already have an account?" msgstr "هل لديك حساب بالفعل؟" -#: templates/base.html:16 templates/index.html:16 templates/welcome.html:24 +#: templates/auth_base.html:16 templates/base.html:16 templates/welcome.html:16 msgid "HAIKAL" msgstr "هيكل" @@ -1112,78 +1150,105 @@ msgstr "هيكل" msgid "add car" msgstr "إضافة سيارة" -#: templates/base.html:143 templates/header.html:69 +#: templates/base.html:140 templates/base.html:149 +msgid "vendors" +msgstr "الموردين" + +#: templates/base.html:143 +msgid "add vendor" +msgstr "إضافة مورد" + +#: templates/base.html:167 templates/header.html:69 msgid "add customer" msgstr "إضافة عميل" -#: templates/base.html:160 templates/base.html:165 templates/base.html:174 -#: templates/header.html:90 templates/header.html:105 -msgid "organizations" -msgstr "المنظمات" +#: templates/base.html:192 templates/organizations/organization_form.html:4 +#: templates/organizations/organization_form.html:7 +msgid "Add Organization" +msgstr "إضافة شركة" -#: templates/base.html:168 templates/header.html:97 -msgid "add organization" -msgstr "إضافة منظمة" - -#: templates/base.html:180 templates/header.html:113 +#: templates/base.html:204 templates/header.html:113 #: templates/representatives/representative_form.html:4 #: templates/representatives/representative_form.html:7 #: templates/representatives/representative_list.html:12 msgid "Add Representative" -msgstr "إضافة ممثل" +msgstr "إضافة ممثل شركة" -#: templates/base.html:197 templates/base.html:202 templates/header.html:132 +#: templates/base.html:221 templates/base.html:226 templates/header.html:132 msgid "sales" msgstr "المبيعات" -#: templates/base.html:205 templates/header.html:139 +#: templates/base.html:229 templates/header.html:139 msgid "create quotation" msgstr "إنشاء عرض" -#: templates/base.html:211 templates/header.html:147 +#: templates/base.html:235 templates/header.html:147 msgid "quotations" msgstr "العروض" -#: templates/base.html:217 +#: templates/base.html:241 msgid "orders" msgstr "الطلبات" -#: templates/base.html:223 +#: templates/base.html:247 msgid "invoices" msgstr "الفواتير" -#: templates/base.html:446 templates/header.html:224 +#: templates/base.html:280 templates/welcome.html:62 +msgid "Haikal" +msgstr "هيكل" + +#: templates/base.html:467 templates/header.html:224 msgid "profile" msgstr "الملف الشخصي" -#: templates/base.html:483 +#: templates/base.html:469 templates/dealers/activity_log.html:11 +#: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:384 +#: venv/lib/python3.11/site-packages/django_ledger/models/journal_entry.py:325 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_txs_table.html:10 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/includes/card_journal_entry.html:33 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_table.html:10 +msgid "Activity" +msgstr "النشاط" + +#: templates/base.html:504 msgid "All right reserved" msgstr "جميع الحقوق محفوظة" -#: templates/base.html:483 +#: templates/base.html:504 msgid "tenhal" msgstr "تنحل" -#: templates/customers/customer_form.html:14 +#: templates/customers/customer_form.html:16 msgid "Edit Customer" msgstr "تحديث العميل" -#: templates/customers/customer_form.html:17 +#: templates/customers/customer_form.html:18 +#: templates/customers/customer_list.html:18 msgid "Add Customer" msgstr "إضافة عميل" -#: templates/customers/customer_form.html:31 +#: templates/customers/customer_form.html:36 +#: templates/organizations/organization_form.html:14 +#: templates/vendors/vendor_form.html:38 +msgid "cancel" +msgstr "إلغاء" + +#: templates/customers/customer_form.html:39 #: templates/inventory/add_colors.html:55 #: templates/inventory/add_custom_card.html:7 #: templates/inventory/car_edit.html:12 #: templates/inventory/car_finance_form.html:40 #: templates/inventory/car_location_form.html:18 #: templates/inventory/color_palette.html:106 -#: templates/organizations/organization_form.html:12 +#: templates/ledger/bank_accounts/bank_account_form.html:31 +#: templates/ledger/coa_accounts/account_form.html:30 +#: templates/organizations/organization_form.html:17 #: templates/representatives/representative_form.html:11 +#: templates/sales/estimates/estimate_form.html:53 #: templates/sales/payments/payment_create.html:16 #: templates/sales/quotation_form.html:18 templates/users/user_form.html:31 -#: templates/vendors/vendor_form.html:31 +#: templates/vendors/vendor_form.html:41 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_item_formset.html:81 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/closing_entry_update.html:19 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/data_import/tags/data_import_job_txs_table.html:78 @@ -1194,131 +1259,72 @@ msgstr "إضافة عميل" msgid "Save" msgstr "حفظ" -#: templates/customers/customer_form.html:33 -#: templates/inventory/add_colors.html:56 -#: templates/inventory/add_custom_card.html:8 -#: templates/inventory/car_confirm_delete.html:14 -#: templates/inventory/car_detail.html:352 -#: templates/inventory/car_finance_form.html:41 -#: templates/inventory/color_palette.html:107 -#: templates/inventory/reserve_car.html:30 -#: templates/organizations/organization_form.html:13 -#: templates/representatives/representative_form.html:12 -#: templates/sales/quotation_form.html:19 templates/users/user_form.html:33 -#: templates/vendors/vendor_form.html:33 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/bill_create.html:37 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/includes/card_bill.html:205 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/components/modals.html:11 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/components/modals_v2.html:9 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/includes/card_invoice.html:188 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/invoice_create.html:42 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/card_po.html:121 -msgid "Cancel" -msgstr "إلغاء" - -#: templates/customers/customer_list.html:21 -#: templates/inventory/car_list.html:70 templates/users/user_list.html:19 -msgid "search" -msgstr "بحث" - #: templates/customers/customer_list.html:27 -msgid "Search customers..." -msgstr "ابحث عن العملاء..." +msgid "Enter customer name" +msgstr "أدخل اسم العميل" -#: templates/customers/customer_list.html:45 -msgid "Customers List" -msgstr "قائمة العملاء" - -#: templates/customers/customer_list.html:55 -#: templates/inventory/car_detail.html:330 -#: templates/inventory/car_inventory.html:40 -#: templates/organizations/organization_list.html:21 -#: templates/representatives/representative_list.html:20 -#: templates/sales/quotation_list.html:19 -#: templates/vendors/vendors_list.html:37 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/account_txs_table.html:29 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:29 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:92 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bank_account/tags/bank_accounts_table.html:39 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_table.html:16 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_table.html:13 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_table.html:36 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/customer/tags/customer_table.html:13 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/data_import/tags/data_import_job_list_table.html:30 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/estimate_table.html:16 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/estimate_table.html:38 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/expense/tags/expense_item_table.html:13 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:27 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:57 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/tags/invoice_table.html:39 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_table.html:16 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/ledger/tags/ledgers_table.html:16 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/ledger/tags/ledgers_table.html:94 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/product/tags/product_table.html:15 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/service/tags/services_table.html:15 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/uom/tags/uom_table.html:11 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/uom/tags/uom_table.html:33 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/vendor/tags/vendor_table.html:14 -msgid "Actions" -msgstr "الإجراءات" +#: templates/customers/customer_list.html:49 +#: templates/vendors/vendors_list.html:49 +msgid "email" +msgstr "البريد الإلكتروني" #: templates/customers/customer_list.html:68 -#: templates/inventory/car_detail.html:154 -#: templates/inventory/car_inventory.html:76 -#: templates/organizations/organization_list.html:32 -#: templates/representatives/representative_list.html:30 -#: templates/sales/quotation_list.html:44 templates/users/user_list.html:60 -#: templates/vendors/vendors_list.html:56 -msgid "view" -msgstr "عرض" +#: templates/organizations/organization_list.html:68 +#: templates/vendors/vendors_list.html:68 +msgid "Create date" +msgstr "تاريخ الإنشاء" -#: templates/customers/customer_list.html:75 -msgid "No customers found." -msgstr "لم يتم العثور على عملاء." - -#: templates/customers/view_customer.html:4 -#: templates/sales/invoice/invoice_detail.html:4 -#: templates/users/user_detail.html:5 -msgid "View Customer" -msgstr "عرض العميل" +#: templates/customers/customer_list.html:87 +msgid "Delete Customer" +msgstr "حذف العميل" +#: templates/customers/customer_list.html:94 #: templates/customers/view_customer.html:19 #: templates/sales/invoice/invoice_detail.html:19 msgid "Are you sure you want to delete this customer?" msgstr "هل أنت متأكد أنك تريد حذف هذا العميل؟" +#: templates/customers/customer_list.html:97 #: templates/customers/view_customer.html:26 #: templates/inventory/car_detail.html:48 +#: templates/ledger/bank_accounts/bank_account_detail.html:26 +#: templates/ledger/coa_accounts/account_detail.html:26 +#: templates/ledger/coa_accounts/account_list.html:82 +#: templates/organizations/organization_list.html:97 #: templates/sales/invoice/invoice_detail.html:26 #: templates/sales/quotation_detail.html:21 templates/users/user_detail.html:27 -#: templates/vendors/view_vendor.html:29 +#: templates/vendors/vendors_list.html:97 templates/vendors/view_vendor.html:29 #: venv/lib/python3.11/site-packages/django/forms/widgets.py:802 msgid "No" msgstr "لا" +#: templates/customers/customer_list.html:100 #: templates/customers/view_customer.html:31 #: templates/inventory/car_detail.html:52 +#: templates/ledger/bank_accounts/bank_account_detail.html:31 +#: templates/ledger/coa_accounts/account_detail.html:32 +#: templates/ledger/coa_accounts/account_list.html:85 +#: templates/organizations/organization_list.html:100 #: templates/sales/invoice/invoice_detail.html:31 #: templates/sales/quotation_detail.html:25 templates/users/user_detail.html:32 +#: templates/vendors/vendors_list.html:100 #: templates/vendors/view_vendor.html:32 #: venv/lib/python3.11/site-packages/django/forms/widgets.py:801 msgid "Yes" msgstr "نعم" -#: templates/customers/view_customer.html:41 -#: templates/sales/invoice/invoice_detail.html:41 -#: templates/sales/quotation_detail.html:42 -#: templates/sales/quotation_pdf.html:32 -msgid "Customer Details" -msgstr "تفاصيل العميل" - -#: templates/customers/view_customer.html:61 -#: templates/inventory/car_detail.html:203 -#: templates/inventory/car_detail.html:387 +#: templates/customers/customer_list.html:127 +#: templates/dealers/dealer_detail.html:24 +#: templates/inventory/car_detail.html:201 +#: templates/ledger/bank_accounts/bank_account_detail.html:57 +#: templates/ledger/coa_accounts/account_detail.html:61 +#: templates/ledger/coa_accounts/account_list.html:113 #: templates/organizations/organization_detail.html:14 +#: templates/organizations/organization_list.html:128 #: templates/representatives/representative_detail.html:13 #: templates/sales/invoice/invoice_detail.html:61 -#: templates/users/user_detail.html:60 templates/vendors/view_vendor.html:64 +#: templates/users/user_detail.html:59 templates/vendors/vendors_list.html:135 +#: templates/vendors/view_vendor.html:64 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/customer/includes/card_customer.html:28 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_table.html:83 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/ledger/tags/ledgers_table.html:101 @@ -1326,11 +1332,17 @@ msgstr "تفاصيل العميل" msgid "Edit" msgstr "تحديث" -#: templates/customers/view_customer.html:67 +#: templates/customers/customer_list.html:129 +#: templates/customers/view_customer.html:51 +#: templates/ledger/bank_accounts/bank_account_detail.html:63 +#: templates/ledger/coa_accounts/account_detail.html:67 +#: templates/ledger/coa_accounts/account_list.html:115 #: templates/organizations/organization_detail.html:17 +#: templates/organizations/organization_list.html:130 #: templates/representatives/representative_detail.html:16 #: templates/sales/invoice/invoice_detail.html:67 -#: templates/users/user_detail.html:66 templates/vendors/view_vendor.html:67 +#: templates/users/user_detail.html:65 templates/vendors/vendors_list.html:137 +#: templates/vendors/view_vendor.html:67 #: 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 @@ -1361,86 +1373,17 @@ msgstr "تحديث" msgid "Delete" msgstr "حذف" -#: templates/customers/view_customer.html:72 -#: templates/inventory/car_detail.html:389 -#: templates/sales/invoice/invoice_detail.html:72 -#: templates/users/user_detail.html:71 -msgid "Back to List" -msgstr "العودة إلى القائمة" +#: templates/customers/view_customer.html:4 +#: templates/sales/invoice/invoice_detail.html:4 +#: templates/users/user_detail.html:5 +msgid "View Customer" +msgstr "عرض العميل" -#: templates/dashboards/accounting.html:30 -msgid "inventory value" -msgstr "قيمة المخزون" +#: templates/customers/view_customer.html:44 +msgid "Customer details" +msgstr "تفاصيل العميل" -#: templates/dashboards/accounting.html:34 -msgid "Profits" -msgstr "الأرباح" - -#: templates/dashboards/accounting.html:44 -msgid "Commissions" -msgstr "العمولات" - -#: templates/dealers/dealer_detail.html:23 -msgid "Profile" -msgstr "الملف الشخصي" - -#: templates/dealers/dealer_detail.html:55 -msgid "Joined" -msgstr "انضم" - -#: templates/dealers/dealer_detail.html:55 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:41 -msgid "ago" -msgstr "منذ" - -#: templates/dealers/dealer_detail.html:62 -msgid "last login" -msgstr "آخر تسجيل دخول" - -#: templates/dealers/dealer_detail.html:66 -msgid "Total users" -msgstr "إجمالي المستخدمين" - -#: templates/dealers/dealer_detail.html:70 -msgid "Subscription" -msgstr "الاشتراك" - -#: templates/dealers/dealer_detail.html:72 -#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:433 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:26 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/customer/tags/customer_table.html:11 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/uom/tags/uom_table.html:10 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/vendor/tags/vendor_table.html:12 -msgid "Active" -msgstr "نشط" - -#: templates/dealers/dealer_detail.html:74 -#: templates/inventory/car_detail.html:358 -msgid "Expired" -msgstr "منتهي الصلاحية" - -#: templates/dealers/dealer_detail.html:86 -msgid "Default Address" -msgstr "العنوان الافتراضي" - -#: templates/dealers/dealer_detail.html:136 -msgid "most valuable" -msgstr "الأكثر قيمة" - -#: templates/dealers/dealer_detail.html:138 -msgid "Active until" -msgstr "نشط حتى" - -#: templates/dealers/dealer_detail8.html:5 -#: templates/dealers/dealer_detail8.html:14 -msgid "Dealer Details" -msgstr "تفاصيل المعرض" - -#: templates/dealers/dealer_detail8.html:45 -msgid "N/A" -msgstr "غير متوفر" - -#: templates/dealers/dealer_detail8.html:49 +#: templates/customers/view_customer.html:54 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:101 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bank_account/bank_account_update.html:23 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bank_account/tags/bank_accounts_table.html:49 @@ -1472,13 +1415,94 @@ msgstr "غير متوفر" msgid "Update" msgstr "تحديث" -#: templates/dealers/dealer_detail8.html:56 -msgid "Account Management" -msgstr "إدارة الحساب" +#: templates/customers/view_customer.html:77 +msgid "Visits" +msgstr "الزيارات" -#: templates/dealers/dealer_detail8.html:71 -msgid "Admin Panel" -msgstr "لوحة التحكم الإدارية" +#: templates/customers/view_customer.html:81 +msgid "Calls" +msgstr "المكالمات" + +#: templates/customers/view_customer.html:85 +#: templates/sales/estimates/estimate_list.html:4 +#: templates/sales/estimates/estimate_list.html:8 +#: templates/sales/quotation_list.html:4 templates/sales/quotation_list.html:8 +msgid "Quotations" +msgstr "العروض" + +#: templates/customers/view_customer.html:96 +#: templates/dealers/dealer_detail.html:78 +msgid "Default Address" +msgstr "العنوان الافتراضي" + +#: templates/customers/view_customer.html:111 +msgid "Notes on Customer" +msgstr "ملاحظات عن العميل" + +#: templates/customers/view_customer.html:113 +msgid "Add Note" +msgstr "إضافة ملاحظة" + +#: templates/dashboards/accounting.html:30 +msgid "inventory value" +msgstr "قيمة المخزون" + +#: templates/dashboards/accounting.html:34 +msgid "Profits" +msgstr "الأرباح" + +#: templates/dashboards/accounting.html:44 +msgid "Commissions" +msgstr "العمولات" + +#: templates/dealers/dealer_detail.html:15 +msgid "Profile" +msgstr "الملف الشخصي" + +#: templates/dealers/dealer_detail.html:47 +msgid "Joined" +msgstr "انضم" + +#: templates/dealers/dealer_detail.html:47 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:41 +msgid "ago" +msgstr "منذ" + +#: templates/dealers/dealer_detail.html:54 +msgid "last login" +msgstr "آخر تسجيل دخول" + +#: templates/dealers/dealer_detail.html:58 +msgid "Total users" +msgstr "إجمالي المستخدمين" + +#: templates/dealers/dealer_detail.html:62 +msgid "Subscription" +msgstr "الاشتراك" + +#: templates/dealers/dealer_detail.html:64 +#: templates/ledger/coa_accounts/account_detail.html:54 +#: templates/ledger/coa_accounts/account_list.html:53 +#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:433 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:26 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/customer/tags/customer_table.html:11 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/uom/tags/uom_table.html:10 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/vendor/tags/vendor_table.html:12 +msgid "Active" +msgstr "نشط" + +#: templates/dealers/dealer_detail.html:66 +#: templates/inventory/car_detail.html:356 +msgid "Expired" +msgstr "منتهي الصلاحية" + +#: templates/dealers/dealer_detail.html:126 +msgid "most valuable" +msgstr "الأكثر قيمة" + +#: templates/dealers/dealer_detail.html:128 +msgid "Active until" +msgstr "نشط حتى" #: templates/dealers/dealer_form.html:5 templates/dealers/dealer_form.html:14 msgid "Update Dealer Information" @@ -1563,7 +1587,16 @@ msgstr "إرسال" msgid "You" msgstr "أنت" -#: templates/header.html:165 templates/vendors/vendor_form.html:17 +#: templates/header.html:90 templates/header.html:105 +msgid "organizations" +msgstr "الشركات" + +#: templates/header.html:97 templates/organizations/organization_list.html:18 +msgid "add organization" +msgstr "إضافة شركة" + +#: templates/header.html:165 templates/vendors/vendor_form.html:20 +#: templates/vendors/vendors_list.html:18 msgid "Add Vendor" msgstr "إضافة مورد" @@ -1587,7 +1620,29 @@ msgstr "إضافة لون" msgid "Select exterior and interior colors for" msgstr "اختر الألوان الخارجية والداخلية لـ" -#: templates/inventory/car_detail.html:5 templates/inventory/car_detail.html:88 +#: templates/inventory/add_colors.html:56 +#: templates/inventory/add_custom_card.html:8 +#: templates/inventory/car_confirm_delete.html:14 +#: templates/inventory/car_detail.html:350 +#: templates/inventory/car_finance_form.html:41 +#: templates/inventory/color_palette.html:107 +#: templates/inventory/reserve_car.html:30 +#: templates/ledger/bank_accounts/bank_account_form.html:33 +#: templates/ledger/coa_accounts/account_form.html:32 +#: templates/representatives/representative_form.html:12 +#: templates/sales/estimates/estimate_form.html:54 +#: templates/sales/quotation_form.html:19 templates/users/user_form.html:33 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/bill_create.html:37 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/includes/card_bill.html:205 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/components/modals.html:11 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/components/modals_v2.html:9 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/includes/card_invoice.html:188 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/invoice_create.html:42 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/card_po.html:121 +msgid "Cancel" +msgstr "إلغاء" + +#: templates/inventory/car_detail.html:5 templates/inventory/car_detail.html:86 #: templates/sales/quotation_detail.html:68 #: templates/sales/quotation_pdf.html:37 msgid "Car Details" @@ -1598,82 +1653,92 @@ msgid "Are you sure you want to reserve this car?" msgstr "هل أنت متأكد أنك تريد حجز هذه السيارة؟" #: templates/inventory/car_detail.html:66 -#: templates/inventory/car_detail.html:147 templates/inventory/car_form.html:37 -#: templates/inventory/car_form.html:322 templates/inventory/car_list.html:47 +#: templates/inventory/car_detail.html:145 templates/inventory/car_form.html:37 +#: templates/inventory/car_form.html:325 templates/inventory/car_list.html:47 #: templates/inventory/car_list.html:221 msgid "specifications" msgstr "المواصفات" #: templates/inventory/car_detail.html:73 templates/inventory/car_form.html:42 -#: templates/inventory/car_form.html:58 templates/partials/scanner_modal.html:6 +#: templates/inventory/car_form.html:49 templates/inventory/car_form.html:61 +#: templates/partials/scanner_modal.html:6 #: templates/partials/specifications_modal.html:8 msgid "Close" msgstr "إغلاق" -#: templates/inventory/car_detail.html:96 templates/inventory/car_list.html:119 +#: templates/inventory/car_detail.html:94 templates/inventory/car_list.html:119 msgid "year" msgstr "السنة" -#: templates/inventory/car_detail.html:100 -#: templates/inventory/car_form.html:140 templates/inventory/car_list.html:79 +#: templates/inventory/car_detail.html:98 templates/inventory/car_form.html:143 +#: templates/inventory/car_list.html:79 msgid "make" msgstr "الصانع" -#: templates/inventory/car_detail.html:104 -#: templates/inventory/car_form.html:159 templates/inventory/car_list.html:97 +#: templates/inventory/car_detail.html:102 +#: templates/inventory/car_form.html:162 templates/inventory/car_list.html:97 msgid "model" msgstr "الموديل" -#: templates/inventory/car_detail.html:108 +#: templates/inventory/car_detail.html:106 #: templates/inventory/car_list.html:130 msgid "series" msgstr "السلسلة" -#: templates/inventory/car_detail.html:112 -#: templates/inventory/car_form.html:204 templates/inventory/car_list.html:141 +#: templates/inventory/car_detail.html:110 +#: templates/inventory/car_form.html:207 templates/inventory/car_list.html:141 msgid "trim" msgstr "الفئة" -#: templates/inventory/car_detail.html:133 +#: templates/inventory/car_detail.html:131 msgid "Branch" msgstr "الفرع" -#: templates/inventory/car_detail.html:175 -#: templates/inventory/car_detail.html:196 +#: templates/inventory/car_detail.html:152 +#: templates/inventory/car_inventory.html:70 +#: templates/ledger/bank_accounts/bank_account_list.html:64 +#: templates/representatives/representative_list.html:30 +#: templates/sales/estimates/estimate_list.html:34 +#: templates/sales/quotation_list.html:44 templates/users/user_list.html:58 +msgid "view" +msgstr "عرض" + +#: templates/inventory/car_detail.html:173 +#: templates/inventory/car_detail.html:194 #: templates/inventory/car_location_form.html:10 msgid "Add" msgstr "إضافة" -#: templates/inventory/car_detail.html:181 -#: templates/inventory/car_inventory.html:39 +#: templates/inventory/car_detail.html:179 +#: templates/inventory/car_inventory.html:33 msgid "Showroom Location" msgstr "موقع صالة العرض" -#: templates/inventory/car_detail.html:185 -#: templates/inventory/car_inventory.html:70 +#: templates/inventory/car_detail.html:183 +#: templates/inventory/car_inventory.html:64 msgid "Our Showroom" msgstr "معرضنا" -#: templates/inventory/car_detail.html:193 +#: templates/inventory/car_detail.html:191 msgid "No location available." msgstr "لا يوجد موقع متاح." -#: templates/inventory/car_detail.html:210 +#: templates/inventory/car_detail.html:208 msgid "Financial Details" msgstr "التفاصيل المالية" -#: templates/inventory/car_detail.html:232 +#: templates/inventory/car_detail.html:230 msgid "Additional Fee" msgstr "رسوم إضافية" -#: templates/inventory/car_detail.html:244 +#: templates/inventory/car_detail.html:242 #: templates/sales/quotation_detail.html:111 #: templates/sales/quotation_pdf.html:67 #: templates/sales/sales_order_detail.html:26 msgid "VAT Amount" msgstr "مبلغ ضريبة القيمة المضافة" -#: templates/inventory/car_detail.html:248 +#: templates/inventory/car_detail.html:246 #: templates/inventory/inventory_stats.html:61 #: templates/sales/quotation_detail.html:78 #: templates/sales/quotation_pdf.html:47 @@ -1694,62 +1759,94 @@ msgstr "مبلغ ضريبة القيمة المضافة" msgid "Total" msgstr "الإجمالي" -#: templates/inventory/car_detail.html:256 +#: templates/inventory/car_detail.html:254 msgid "Edit Finance Details" msgstr "تعديل التفاصيل المالية" -#: templates/inventory/car_detail.html:261 +#: templates/inventory/car_detail.html:259 msgid "No finance details available." msgstr "لا توجد تفاصيل مالية متاحة." -#: templates/inventory/car_detail.html:264 +#: templates/inventory/car_detail.html:262 msgid "Add Finance Details" msgstr "إضافة التفاصيل المالية" -#: templates/inventory/car_detail.html:273 +#: templates/inventory/car_detail.html:271 msgid "Colors Details" msgstr "تفاصيل الألوان" -#: templates/inventory/car_detail.html:280 +#: templates/inventory/car_detail.html:278 msgid "Exterior" msgstr "الخارجي" -#: templates/inventory/car_detail.html:291 +#: templates/inventory/car_detail.html:289 msgid "Interior" msgstr "الداخلي" -#: templates/inventory/car_detail.html:305 +#: templates/inventory/car_detail.html:303 msgid "No colors available for this car." msgstr "لا تتوفر ألوان لهذه السيارة." -#: templates/inventory/car_detail.html:311 +#: templates/inventory/car_detail.html:309 msgid "Get Colors" msgstr "الحصول على الألوان" -#: templates/inventory/car_detail.html:322 +#: templates/inventory/car_detail.html:320 msgid "Reservations Details" msgstr "تفاصيل الحجز" -#: templates/inventory/car_detail.html:329 +#: templates/inventory/car_detail.html:327 msgid "Expires At" msgstr "ينتهي في" -#: templates/inventory/car_detail.html:346 +#: templates/inventory/car_detail.html:328 +#: templates/inventory/car_inventory.html:34 +#: templates/ledger/bank_accounts/bank_account_list.html:53 +#: templates/representatives/representative_list.html:20 +#: templates/sales/estimates/estimate_list.html:20 +#: templates/sales/quotation_list.html:19 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/account_txs_table.html:29 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:29 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:92 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bank_account/tags/bank_accounts_table.html:39 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_table.html:16 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_table.html:13 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_table.html:36 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/customer/tags/customer_table.html:13 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/data_import/tags/data_import_job_list_table.html:30 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/estimate_table.html:16 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/estimate_table.html:38 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/expense/tags/expense_item_table.html:13 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:27 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:57 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/tags/invoice_table.html:39 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_table.html:16 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/ledger/tags/ledgers_table.html:16 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/ledger/tags/ledgers_table.html:94 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/product/tags/product_table.html:15 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/service/tags/services_table.html:15 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/uom/tags/uom_table.html:11 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/uom/tags/uom_table.html:33 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/vendor/tags/vendor_table.html:14 +msgid "Actions" +msgstr "الإجراءات" + +#: templates/inventory/car_detail.html:344 msgid "Renew" msgstr "تجديد" -#: templates/inventory/car_detail.html:371 +#: templates/inventory/car_detail.html:369 #: templates/inventory/reserve_car.html:29 msgid "Reserve" msgstr "حجز" -#: templates/inventory/car_detail.html:468 +#: templates/inventory/car_detail.html:455 #: templates/inventory/car_list.html:542 #: templates/partials/specifications_modal.html:11 msgid "No specifications available." msgstr "لا توجد مواصفات متاحة." -#: templates/inventory/car_detail.html:472 +#: templates/inventory/car_detail.html:459 #: templates/inventory/car_list.html:546 msgid "Error loading specifications." msgstr "حدث خطأ أثناء تحميل المواصفات." @@ -1766,70 +1863,67 @@ msgstr "التفاصيل المالية السيارة" msgid "Finance Details for" msgstr "التفاصيل المالية لـ" -#: templates/inventory/car_form.html:57 +#: templates/inventory/car_form.html:60 msgid "scanner" msgstr "الماسح الضوئي" -#: templates/inventory/car_form.html:62 +#: templates/inventory/car_form.html:65 #: templates/partials/scanner_modal.html:10 msgid "VIN will appear here." msgstr "رقم الهيكل سيظهر هنا." -#: templates/inventory/car_form.html:63 +#: templates/inventory/car_form.html:66 #: templates/partials/scanner_modal.html:11 msgid "Use OCR Fallback" msgstr "التعرف الآلي على الحروف" -#: templates/inventory/car_form.html:100 -#: templates/organizations/organization_list.html:9 -#: templates/organizations/organization_list.html:10 +#: templates/inventory/car_form.html:103 #: templates/representatives/representative_list.html:9 #: templates/representatives/representative_list.html:10 -#: templates/vendors/vendors_list.html:15 msgid "Search" msgstr "بحث" -#: templates/inventory/car_form.html:165 templates/inventory/car_form.html:187 -#: templates/inventory/car_form.html:209 templates/inventory/car_form.html:510 -#: templates/inventory/car_form.html:529 templates/inventory/car_form.html:530 -#: templates/inventory/car_form.html:548 +#: templates/inventory/car_form.html:168 templates/inventory/car_form.html:190 +#: templates/inventory/car_form.html:212 templates/inventory/car_form.html:513 +#: templates/inventory/car_form.html:532 templates/inventory/car_form.html:533 +#: templates/inventory/car_form.html:551 msgid "Select" msgstr "اختيار" -#: templates/inventory/car_form.html:329 +#: templates/inventory/car_form.html:332 msgid "Save and Add Another" msgstr "حفظ وإضافة آخر" -#: templates/inventory/car_form.html:335 +#: templates/inventory/car_form.html:338 msgid "Save and Go to Inventory" msgstr "حفظ والانتقال إلى المخزون" -#: templates/inventory/car_form.html:416 templates/inventory/car_form.html:417 +#: templates/inventory/car_form.html:419 templates/inventory/car_form.html:420 msgid "Please enter a valid VIN." msgstr "الرجاء إدخال رقم هيكل صالح مكون من 17 حرفًا." -#: templates/inventory/car_form.html:435 +#: templates/inventory/car_form.html:438 msgid "Failed to decode VIN." msgstr "فشل في فك تشفير رقم الهيكل" -#: templates/inventory/car_form.html:440 templates/inventory/car_form.html:441 +#: templates/inventory/car_form.html:443 templates/inventory/car_form.html:444 msgid "An error occurred while decoding the VIN." msgstr "حدث خطأ أثناء فك تشفير الهيكل" -#: templates/inventory/car_inventory.html:37 +#: templates/inventory/car_inventory.html:31 msgid "Exterior Color" msgstr "اللون الخارجي" -#: templates/inventory/car_inventory.html:38 +#: templates/inventory/car_inventory.html:32 msgid "Interior Color" msgstr "اللون الداخلي" -#: templates/inventory/car_inventory.html:66 -#: templates/inventory/car_inventory.html:67 +#: templates/inventory/car_inventory.html:60 +#: templates/inventory/car_inventory.html:61 msgid "No Color" msgstr "بدون لون" -#: templates/inventory/car_inventory.html:82 +#: templates/inventory/car_inventory.html:76 msgid "No cars available." msgstr "لا توجد سيارات متاحة." @@ -1837,6 +1931,13 @@ msgstr "لا توجد سيارات متاحة." msgid "options" msgstr "الخيارات" +#: templates/inventory/car_list.html:70 +#: templates/ledger/bank_accounts/bank_account_list.html:21 +#: templates/ledger/coa_accounts/account_list.html:21 +#: templates/users/user_list.html:19 +msgid "search" +msgstr "بحث" + #: templates/inventory/car_list.html:81 templates/inventory/car_list.html:99 #: templates/inventory/car_list.html:110 templates/inventory/car_list.html:121 #: templates/inventory/car_list.html:132 templates/inventory/car_list.html:143 @@ -1962,29 +2063,195 @@ msgstr "نقل السيارة" msgid "transfer car" msgstr "نقل السيارة" +#: templates/ledger/bank_accounts/bank_account_detail.html:4 +msgid "View Bank Account" +msgstr "عرض الحساب البنكي" + +#: templates/ledger/bank_accounts/bank_account_detail.html:19 +msgid "Are you sure you want to delete this bank account?" +msgstr "هل أنت متأكد أنك تريد حذف هذا الحساب البنكي؟" + +#: templates/ledger/bank_accounts/bank_account_detail.html:41 +#: templates/ledger/coa_accounts/account_detail.html:44 +msgid "Bank Account Details" +msgstr "تفاصيل الحساب البنكي" + +#: templates/ledger/bank_accounts/bank_account_detail.html:46 +msgid "Bank Account Name" +msgstr "اسم الحساب البنكي" + +#: templates/ledger/bank_accounts/bank_account_detail.html:47 +#: venv/lib/python3.11/site-packages/django_ledger/forms/bank_account.py:83 +#: venv/lib/python3.11/site-packages/django_ledger/models/bank_account.py:129 +#: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:322 +#: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:222 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/bill_detail.html:31 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/invoice_detail.html:30 +msgid "Cash Account" +msgstr "حساب نقدي" + +#: templates/ledger/bank_accounts/bank_account_detail.html:68 +#: templates/ledger/coa_accounts/account_detail.html:72 +#: templates/sales/invoice/invoice_detail.html:72 +#: templates/users/user_detail.html:70 +msgid "Back to List" +msgstr "العودة إلى القائمة" + +#: templates/ledger/bank_accounts/bank_account_form.html:4 +msgid "bank account" +msgstr "الحساب المصرفي" + +#: templates/ledger/bank_accounts/bank_account_form.html:14 +msgid "Edit Bank Account" +msgstr "تحديث الحساب المصرفي" + +#: templates/ledger/bank_accounts/bank_account_form.html:17 +msgid "Add Bank Account" +msgstr "إضافة حساب بنكي" + +#: templates/ledger/bank_accounts/bank_account_list.html:3 +#: venv/lib/python3.11/site-packages/django_ledger/views/bank_account.py:33 +msgid "Bank Accounts" +msgstr "الحسابات المصرفية" + +#: templates/ledger/bank_accounts/bank_account_list.html:27 +#: templates/ledger/coa_accounts/account_list.html:27 +msgid "Search accounts..." +msgstr "ابحث عن العملاء..." + +#: templates/ledger/bank_accounts/bank_account_list.html:45 +msgid "Customers List" +msgstr "قائمة العملاء" + +#: templates/ledger/bank_accounts/bank_account_list.html:52 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/product/tags/product_table.html:8 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/service/tags/services_table.html:8 +msgid "Type" +msgstr "النوع" + +#: templates/ledger/bank_accounts/bank_account_list.html:71 +msgid "No customers found." +msgstr "لم يتم العثور على عملاء." + +#: templates/ledger/coa_accounts/account_detail.html:4 +msgid "View Account" +msgstr "عرض الحساب" + +#: templates/ledger/coa_accounts/account_detail.html:19 +msgid "Are you sure you want to delete this account?" +msgstr "هل أنت متأكد أنك تريد حذف هذا الحساب؟" + +#: templates/ledger/coa_accounts/account_detail.html:49 +#: templates/ledger/coa_accounts/account_list.html:50 +#: venv/lib/python3.11/site-packages/django_ledger/forms/bank_account.py:80 +#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:428 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:23 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:21 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:10 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:43 +msgid "Account Name" +msgstr "اسم الحساب" + +#: templates/ledger/coa_accounts/account_detail.html:50 +#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:427 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:20 +msgid "Account Code" +msgstr "رمز الحساب" + +#: templates/ledger/coa_accounts/account_detail.html:53 +#: templates/ledger/coa_accounts/account_list.html:52 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:25 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:25 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/income_statement.html:13 +msgid "Balance Type" +msgstr "نوع الرصيد" + +#: templates/ledger/coa_accounts/account_form.html:4 +msgid "account" +msgstr "الحساب" + +#: templates/ledger/coa_accounts/account_form.html:14 +msgid "Edit Account" +msgstr "تعديل الحساب" + +#: templates/ledger/coa_accounts/account_form.html:17 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:52 +msgid "Add Account" +msgstr "إضافة حساب" + +#: templates/ledger/coa_accounts/account_list.html:3 +#: templates/ledger/coa_accounts/account_list.html:6 +#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:444 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:48 +msgid "Accounts" +msgstr "الحسابات" + +#: templates/ledger/coa_accounts/account_list.html:51 +msgid "Code" +msgstr "الكود" + +#: templates/ledger/coa_accounts/account_list.html:71 +msgid "Delete Account" +msgstr "حذف الحساب" + +#: templates/ledger/coa_accounts/account_list.html:78 +msgid "Are you sure you want to delete this Account?" +msgstr "هل أنت متأكد أنك تريد حذف هذا الحساب؟" + +#: templates/ledger/coa_accounts/account_list.html:99 +#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:423 +#: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:474 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:13 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:45 +msgid "Debit" +msgstr "مدين" + +#: templates/ledger/coa_accounts/account_list.html:101 +#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:422 +#: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:473 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:12 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:44 +msgid "Credit" +msgstr "دائن" + +#: templates/ledger/coa_accounts/account_list.html:124 +msgid "No account found." +msgstr "لم يتم العثور على حساب." + +#: templates/ledger/coa_accounts/account_list.html:132 +msgid "to" +msgstr "إلى" + +#: templates/ledger/coa_accounts/account_list.html:132 +msgid "Items of" +msgstr "عناصر" + #: templates/organizations/organization_detail.html:3 msgid "Organization Details" -msgstr "تفاصيل عرض السعر" +msgstr "تفاصيل الشركة" #: templates/organizations/organization_detail.html:8 -#: templates/organizations/organization_list.html:18 +#: templates/organizations/organization_list.html:49 msgid "CRN" msgstr "رقم السجل التجاري" #: templates/organizations/organization_detail.html:9 -#: templates/organizations/organization_list.html:19 +#: templates/organizations/organization_list.html:54 msgid "VRN" msgstr "الرقم الضريبي" -#: templates/organizations/organization_form.html:4 -#: templates/organizations/organization_form.html:7 -#: templates/organizations/organization_list.html:12 -msgid "Add Organization" -msgstr "إضافة منظمة" +#: templates/organizations/organization_list.html:27 +msgid "Enter Organization name" +msgstr "أدخل اسم الشركة" -#: templates/organizations/organization_list.html:37 -msgid "No organizations found." -msgstr "لم يتم العثور على منظمات." +#: templates/organizations/organization_list.html:87 +#: templates/vendors/vendors_list.html:87 templates/vendors/view_vendor.html:18 +msgid "Delete Vendor" +msgstr "حذف مورد" + +#: templates/organizations/organization_list.html:94 +msgid "Are you sure you want to delete this Organization?" +msgstr "هل أنت متأكد أنك تريد حذف هذه الشركة؟" #: templates/partials/scanner_modal.html:5 msgid "Scanner" @@ -1996,11 +2263,42 @@ msgstr "المواصفات" #: templates/representatives/representative_detail.html:3 msgid "Representative Details" -msgstr "تفاصيل الممثل" +msgstr "تفاصيل ممثل الشركة" #: templates/representatives/representative_list.html:35 msgid "No representatives found." -msgstr "لم يتم العثور على ممثلين." +msgstr "لم يتم العثور على ممثلين للشركات." + +#: templates/sales/estimates/estimate_detail.html:4 +msgid "View Estimate" +msgstr "عرض التقدير" + +#: templates/sales/estimates/estimate_form.html:5 +#: templates/sales/estimates/estimate_form.html:9 +msgid "Create Estimate" +msgstr "إنشاء تقدير" + +#: templates/sales/estimates/estimate_list.html:15 +#: venv/lib/python3.11/site-packages/django_ledger/models/estimate.py:247 +msgid "Estimate Number" +msgstr "رقم التقدير" + +#: templates/sales/estimates/estimate_list.html:18 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_table.html:11 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/estimate_table.html:13 +msgid "Status Date" +msgstr "تاريخ الحالة" + +#: templates/sales/estimates/estimate_list.html:40 +#: templates/sales/quotation_list.html:51 +msgid "No Quotations Found" +msgstr "لم يتم العثور على عروض" + +#: templates/sales/invoice/invoice_detail.html:41 +#: templates/sales/quotation_detail.html:42 +#: templates/sales/quotation_pdf.html:32 +msgid "Customer Details" +msgstr "تفاصيل العميل" #: templates/sales/payments/payment_create.html:5 #: templates/sales/payments/payment_create.html:11 @@ -2076,10 +2374,6 @@ msgstr "قبول" msgid "Create Quotation" msgstr "إنشاء عرض" -#: templates/sales/quotation_list.html:4 templates/sales/quotation_list.html:8 -msgid "Quotations" -msgstr "العروض" - #: templates/sales/quotation_list.html:14 msgid "Quotation Number" msgstr "رقم عرض السعر" @@ -2088,10 +2382,6 @@ msgstr "رقم عرض السعر" msgid "Total Cars" msgstr "إجمالي السيارات" -#: templates/sales/quotation_list.html:51 -msgid "No Quotations Found" -msgstr "لم يتم العثور على عروض" - #: templates/sales/quotation_pdf.html:7 msgid "Quotation PDF" msgstr "عرض الأسعار بصيغة PDF" @@ -2129,7 +2419,7 @@ msgstr "هل أنت متأكد أنك تريد حذف هذا المستخدم؟" msgid "User Details" msgstr "تفاصيل المستخدم" -#: templates/users/user_detail.html:53 +#: templates/users/user_detail.html:52 msgid "Role" msgstr "الدور" @@ -2155,104 +2445,37 @@ msgid "phone number" msgstr "رقم الهاتف" #: templates/users/user_list.html:44 -msgid "address" -msgstr "العنوان" - -#: templates/users/user_list.html:45 msgid "role" msgstr "الدور" -#: templates/users/user_list.html:46 +#: templates/users/user_list.html:45 msgid "actions" msgstr "الإجراءات" -#: templates/vendors/vendor_form.html:14 +#: templates/vendors/vendor_form.html:17 msgid "Edit Vendor" msgstr "تعديل مورد" -#: templates/vendors/vendors_list.html:20 +#: templates/vendors/vendors_list.html:27 msgid "Enter vendor name" msgstr "أدخل اسم المورد" -#: templates/vendors/vendors_list.html:63 -msgid "No vendors found" -msgstr "لم يتم العثور على موردين" +#: templates/vendors/vendors_list.html:59 +msgid "Contact name" +msgstr "اسم جهة الاتصال" + +#: templates/vendors/vendors_list.html:94 templates/vendors/view_vendor.html:24 +msgid "Are you sure you want to delete this vendor?" +msgstr "هل أنت متأكد أنك تريد حذف هذا المورد؟" #: templates/vendors/view_vendor.html:3 msgid "View Vendor" msgstr "عرض المورد" -#: templates/vendors/view_vendor.html:18 -msgid "Delete Vendor" -msgstr "حذف مورد" - -#: templates/vendors/view_vendor.html:24 -msgid "Are you sure you want to delete this vendor?" -msgstr "هل أنت متأكد أنك تريد حذف هذا المورد؟" - #: templates/vendors/view_vendor.html:42 msgid "Vendor Details" msgstr "تفاصيل المورد" -#: templates/welcome.html:4 -msgid "Welcome to Our App" -msgstr "مرحبا بكم في تطبيقنا" - -#: templates/welcome.html:24 -msgid "Welcome to " -msgstr "مرحبا بكم في " - -#: templates/welcome.html:25 -msgid "" -"Discover a seamless way to manage your cars, reservations, and inventory " -"like never before!" -msgstr "" -"اكتشف طريقة سهلة وسلسة لإدارة سياراتك وحجوزاتك ومخزونك كما لم تفعل من قبل!" - -#: templates/welcome.html:26 -msgid "Get Started" -msgstr "ابدأ الآن" - -#: templates/welcome.html:33 -msgid "Why Choose Haikal?" -msgstr "لماذا تختار هيكل؟" - -#: templates/welcome.html:38 -msgid "Fast and Efficient" -msgstr "سريع وفعال" - -#: templates/welcome.html:39 -msgid "" -"Haikal is optimized for speed and ease of use, saving you time and effort." -msgstr "" -"تم تحسين هيكل من أجل السرعة وسهولة الاستخدام، مما يوفر لك الوقت والجهد." - -#: templates/welcome.html:45 -msgid "Secure and Reliable" -msgstr "آمن وموثوق" - -#: templates/welcome.html:46 -msgid "Your data is protected with industry-standard security and encryption." -msgstr "بياناتك محمية بمعايير الأمان والتشفير المعتمدة عالميًا." - -#: templates/welcome.html:52 -msgid "Detailed Insights" -msgstr "رؤى مفصلة" - -#: templates/welcome.html:53 -msgid "" -"Gain valuable insights into your inventory and performance with our " -"analytics tools." -msgstr "احصل على رؤى قيمة حول مخزونك وأدائك باستخدام أدوات التحليل الخاصة بنا." - -#: templates/welcome.html:60 -msgid "Ready to take control of your inventory?" -msgstr "هل أنت مستعد للتحكم في مخزونك؟" - -#: templates/welcome.html:61 -msgid "Join Us Today" -msgstr "انضم لنا اليوم" - #: venv/lib/python3.11/site-packages/alabaster/layout.html:99 msgid "Page source" msgstr "مصدر الصفحة" @@ -3936,15 +4159,6 @@ msgstr "أدخل رقم ABA..." msgid "Enter SWIFT number..." msgstr "أدخل رقم SWIFT..." -#: venv/lib/python3.11/site-packages/django_ledger/forms/bank_account.py:80 -#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:428 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:23 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:21 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:10 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:43 -msgid "Account Name" -msgstr "اسم الحساب" - #: venv/lib/python3.11/site-packages/django_ledger/forms/bank_account.py:81 #: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:1134 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/income_statement.html:8 @@ -3956,15 +4170,6 @@ msgstr "رقم الحساب" msgid "Account Type" msgstr "نوع الحساب" -#: venv/lib/python3.11/site-packages/django_ledger/forms/bank_account.py:83 -#: venv/lib/python3.11/site-packages/django_ledger/models/bank_account.py:129 -#: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:322 -#: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:222 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/bill_detail.html:31 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/invoice_detail.html:30 -msgid "Cash Account" -msgstr "حساب نقدي" - #: venv/lib/python3.11/site-packages/django_ledger/forms/bank_account.py:84 #: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:1139 msgid "ABA Number" @@ -4542,25 +4747,6 @@ msgstr "مصروفات أخرى" msgid "Account code must be alpha numeric, got {%s}" msgstr "يجب أن يكون رمز الحساب مزيجاً من الحروف والأرقام، تم تلقي {%s}" -#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:422 -#: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:473 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:12 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:44 -msgid "Credit" -msgstr "دائن" - -#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:423 -#: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:474 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:13 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:45 -msgid "Debit" -msgstr "مدين" - -#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:427 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:20 -msgid "Account Code" -msgstr "رمز الحساب" - #: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:429 msgid "Account Role" msgstr "دور الحساب" @@ -4587,11 +4773,6 @@ msgstr "مقفل" msgid "Chart of Accounts" msgstr "قائمة الحسابات" -#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:444 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:48 -msgid "Accounts" -msgstr "الحسابات" - #: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:449 msgid "Account codes must be unique for each Chart of Accounts Model." msgstr "يجب أن تكون رموز الحساب فريدة لكل نموذج من نماذج دليل الحسابات." @@ -4752,14 +4933,6 @@ msgstr "لا يمكن التراجع عن هذا الإجراء." msgid "Account Model" msgstr "نموذج الحساب" -#: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:384 -#: venv/lib/python3.11/site-packages/django_ledger/models/journal_entry.py:325 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_txs_table.html:10 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/includes/card_journal_entry.html:33 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_table.html:10 -msgid "Activity" -msgstr "النشاط" - #: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:387 msgid "Transaction Type" msgstr "نوع المعاملة" @@ -4960,10 +5133,6 @@ msgstr "أذونات القراءة/الكتابة" msgid "No Permissions" msgstr "بدون أذونات" -#: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:3190 -msgid "Manager" -msgstr "مدير" - #: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:3195 msgid "Permission Level" msgstr "مستوى الأذونات" @@ -4989,10 +5158,6 @@ msgstr "الوقت والمواد" msgid "Other" msgstr "أخرى" -#: venv/lib/python3.11/site-packages/django_ledger/models/estimate.py:247 -msgid "Estimate Number" -msgstr "رقم التقدير" - #: venv/lib/python3.11/site-packages/django_ledger/models/estimate.py:253 msgid "Contract Terms" msgstr "شروط العقد" @@ -5798,12 +5963,6 @@ msgstr "العودة إلى قائمة مخطط الحسابات" msgid "CoA" msgstr "مخطط الحسابات" -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:25 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:25 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/income_statement.html:13 -msgid "Balance Type" -msgstr "نوع الرصيد" - #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:28 msgid "CoA Role Default" msgstr "الدور الافتراضي لمخطط الحسابات" @@ -6166,19 +6325,6 @@ msgstr "كمية أمر الشراء" msgid "PO Amount" msgstr "مبلغ أمر الشراء" -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_item_formset.html:23 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_txs_table.html:9 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/balance_sheet.html:32 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/cash_flow.html:33 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/income_statement.html:28 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html:23 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/financial_statements/tags/income_statement.html:11 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_table.html:14 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:11 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/po_item_formset.html:21 -msgid "Unit" -msgstr "الوحدة" - #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_item_formset.html:79 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/tags/ce_item_formset.html:74 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/tags/invoice_item_formset.html:69 @@ -6190,11 +6336,6 @@ msgstr "عنصر جديد" msgid "Number" msgstr "الرقم" -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_table.html:11 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/estimate_table.html:13 -msgid "Status Date" -msgstr "تاريخ الحالة" - #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_table.html:14 msgid "Payments" msgstr "المدفوعات" @@ -6223,10 +6364,6 @@ msgstr "الحسابات النشطة" msgid "Locked Accounts" msgstr "الحسابات المقفلة" -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:52 -msgid "Add Account" -msgstr "إضافة حساب" - #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:58 msgid "Mark as Default" msgstr "وضع كافتراضي" @@ -6983,11 +7120,6 @@ msgstr "إلغاء الإخفاء" msgid "Products List" msgstr "قائمة المنتجات" -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/product/tags/product_table.html:8 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/service/tags/services_table.html:8 -msgid "Type" -msgstr "النوع" - #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/product/tags/product_table.html:12 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/service/tags/services_table.html:12 msgid "SKU" @@ -7132,10 +7264,6 @@ msgstr "حسابات الكيان" msgid "Update Account" msgstr "تحديث الحساب" -#: venv/lib/python3.11/site-packages/django_ledger/views/bank_account.py:33 -msgid "Bank Accounts" -msgstr "الحسابات المصرفية" - #: venv/lib/python3.11/site-packages/django_ledger/views/bank_account.py:76 msgid "Update Bank Account" msgstr "تحديث الحساب المصرفي" diff --git a/static/images/.DS_Store b/static/images/.DS_Store index 6b68c4d0..881631b2 100644 Binary files a/static/images/.DS_Store and b/static/images/.DS_Store differ diff --git a/static/images/generic/2022-lincoln-corsair.jpg b/static/images/generic/2022-lincoln-corsair.jpg new file mode 100644 index 00000000..45613e28 Binary files /dev/null and b/static/images/generic/2022-lincoln-corsair.jpg differ diff --git a/static/images/generic/2022-lincoln-corsair.png b/static/images/generic/2022-lincoln-corsair.png new file mode 100644 index 00000000..754e7d37 Binary files /dev/null and b/static/images/generic/2022-lincoln-corsair.png differ diff --git a/static/images/generic/haikal-3.jpg b/static/images/generic/haikal-3.jpg new file mode 100644 index 00000000..1b752a0a Binary files /dev/null and b/static/images/generic/haikal-3.jpg differ diff --git a/static/images/generic/haikal-5.jpg b/static/images/generic/haikal-5.jpg new file mode 100644 index 00000000..871b6d13 Binary files /dev/null and b/static/images/generic/haikal-5.jpg differ diff --git a/static/images/logos/.DS_Store b/static/images/logos/.DS_Store index 90e240b1..56bc43f0 100644 Binary files a/static/images/logos/.DS_Store and b/static/images/logos/.DS_Store differ diff --git a/static/images/logos/users/marwan-company_DSEJMeO.png b/static/images/logos/users/marwan-company_DSEJMeO.png new file mode 100644 index 00000000..b8addbe8 Binary files /dev/null and b/static/images/logos/users/marwan-company_DSEJMeO.png differ diff --git a/static/images/logos/vendors/Abdullatif-Jameel-Automotive.png b/static/images/logos/vendors/Abdullatif-Jameel-Automotive.png new file mode 100644 index 00000000..2bb7cadc Binary files /dev/null and b/static/images/logos/vendors/Abdullatif-Jameel-Automotive.png differ diff --git a/static/images/logos/vendors/Abdullatif-Jameel-Automotive_llAxTWL.png b/static/images/logos/vendors/Abdullatif-Jameel-Automotive_llAxTWL.png new file mode 100644 index 00000000..2bb7cadc Binary files /dev/null and b/static/images/logos/vendors/Abdullatif-Jameel-Automotive_llAxTWL.png differ diff --git a/static/images/logos/vendors/Alamjdouie-Hyundai-logo.png b/static/images/logos/vendors/Alamjdouie-Hyundai-logo.png new file mode 100644 index 00000000..53525aa2 Binary files /dev/null and b/static/images/logos/vendors/Alamjdouie-Hyundai-logo.png differ diff --git a/static/images/logos/vendors/Alamjdouie-Hyundai-logo_I8WTQve.png b/static/images/logos/vendors/Alamjdouie-Hyundai-logo_I8WTQve.png new file mode 100644 index 00000000..53525aa2 Binary files /dev/null and b/static/images/logos/vendors/Alamjdouie-Hyundai-logo_I8WTQve.png differ diff --git a/static/images/logos/vendors/Aljazirah-Vehicles-Agencies-Co-logo.png b/static/images/logos/vendors/Aljazirah-Vehicles-Agencies-Co-logo.png new file mode 100644 index 00000000..b7b8e211 Binary files /dev/null and b/static/images/logos/vendors/Aljazirah-Vehicles-Agencies-Co-logo.png differ diff --git a/static/images/logos/vendors/Aljazirah-Vehicles-Agencies-Co-logo_Fh187lJ.png b/static/images/logos/vendors/Aljazirah-Vehicles-Agencies-Co-logo_Fh187lJ.png new file mode 100644 index 00000000..b7b8e211 Binary files /dev/null and b/static/images/logos/vendors/Aljazirah-Vehicles-Agencies-Co-logo_Fh187lJ.png differ diff --git a/static/images/logos/vendors/Aljazirah-Vehicles-Agencies-Co.png b/static/images/logos/vendors/Aljazirah-Vehicles-Agencies-Co.png new file mode 100644 index 00000000..b7b8e211 Binary files /dev/null and b/static/images/logos/vendors/Aljazirah-Vehicles-Agencies-Co.png differ diff --git a/static/images/logos/vendors/Aljumaih-Automotive-logo.png b/static/images/logos/vendors/Aljumaih-Automotive-logo.png new file mode 100644 index 00000000..04ee0afa Binary files /dev/null and b/static/images/logos/vendors/Aljumaih-Automotive-logo.png differ diff --git a/static/images/logos/vendors/Aljumaih-Automotive-logo_kM7B61x.png b/static/images/logos/vendors/Aljumaih-Automotive-logo_kM7B61x.png new file mode 100644 index 00000000..04ee0afa Binary files /dev/null and b/static/images/logos/vendors/Aljumaih-Automotive-logo_kM7B61x.png differ diff --git a/static/images/logos/vendors/Aljumaih-Automotive.png b/static/images/logos/vendors/Aljumaih-Automotive.png new file mode 100644 index 00000000..a1707fbc Binary files /dev/null and b/static/images/logos/vendors/Aljumaih-Automotive.png differ diff --git a/static/images/logos/vendors/muhammad-yousef-naghi-logo.png b/static/images/logos/vendors/muhammad-yousef-naghi-logo.png new file mode 100644 index 00000000..a1623c1d Binary files /dev/null and b/static/images/logos/vendors/muhammad-yousef-naghi-logo.png differ diff --git a/static/images/logos/vendors/muhammad-yousef-naghi-logo_5OXBztM.png b/static/images/logos/vendors/muhammad-yousef-naghi-logo_5OXBztM.png new file mode 100644 index 00000000..a1623c1d Binary files /dev/null and b/static/images/logos/vendors/muhammad-yousef-naghi-logo_5OXBztM.png differ diff --git a/static/js/travel-agency-dashboard.js b/static/js/travel-agency-dashboard.js index 37107884..ae622bfe 100644 --- a/static/js/travel-agency-dashboard.js +++ b/static/js/travel-agency-dashboard.js @@ -754,7 +754,7 @@ color: getItemFromStore('phoenixTheme') === 'dark' ? getColor('primary') - : getColor('primary') + : getColor('primary-light') }, data: profitData[0] }, @@ -772,7 +772,7 @@ color: getItemFromStore('phoenixTheme') === 'dark' ? getColor('success') - : getColor('success') + : getColor('success-light') }, data: revenueData[0] }, @@ -788,7 +788,7 @@ color: getItemFromStore('phoenixTheme') === 'dark' ? getColor('info') - : getColor('info') + : getColor('info-light') }, data: expansesData[0] } diff --git a/templates/.DS_Store b/templates/.DS_Store index 85faf9e3..de0efc82 100644 Binary files a/templates/.DS_Store and b/templates/.DS_Store differ diff --git a/templates/account/signup-wizard.html b/templates/account/signup-wizard.html index 4ea97776..ac3c850b 100644 --- a/templates/account/signup-wizard.html +++ b/templates/account/signup-wizard.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "auth_base.html" %} {% load crispy_forms_filters %} {% load i18n static %} @@ -70,7 +70,7 @@
- +
diff --git a/templates/auth_base.html b/templates/auth_base.html new file mode 100644 index 00000000..284d9b76 --- /dev/null +++ b/templates/auth_base.html @@ -0,0 +1,229 @@ +{% load static %} {% load i18n %} + +{% get_current_language as LANGUAGE_CODE %} + + + + + + + + + {% block title %}{% trans 'HAIKAL' %}{% endblock %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% if LANGUAGE_CODE == 'en' %} + + + {% else %} + + + {% endif %} + + + + + {% include 'messages.html' %} +
+ +
+ +{% block content %} + +{% endblock %} + + +
+ + + +
+ + + + + {% block extra_js %}{% endblock extra_js %} + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 5272c81c..1de89286 100644 --- a/templates/base.html +++ b/templates/base.html @@ -107,7 +107,7 @@