diff --git a/api/__pycache__/serializers.cpython-311.pyc b/api/__pycache__/serializers.cpython-311.pyc index 9e450747..d662ba35 100644 Binary files a/api/__pycache__/serializers.cpython-311.pyc and b/api/__pycache__/serializers.cpython-311.pyc differ diff --git a/api/__pycache__/urls.cpython-311.pyc b/api/__pycache__/urls.cpython-311.pyc index b84ced86..d965902f 100644 Binary files a/api/__pycache__/urls.cpython-311.pyc and b/api/__pycache__/urls.cpython-311.pyc differ diff --git a/api/__pycache__/views.cpython-311.pyc b/api/__pycache__/views.cpython-311.pyc index 85e62eba..38bd7efa 100644 Binary files a/api/__pycache__/views.cpython-311.pyc and b/api/__pycache__/views.cpython-311.pyc differ diff --git a/api/routing.py b/api/routing.py index 895c23d3..93ee2d61 100644 --- a/api/routing.py +++ b/api/routing.py @@ -3,4 +3,5 @@ # # websocket_urlpatterns = [ # re_path(r'ws/vin_scan/$', consumers.VINScanConsumer.as_asgi()), -# ] \ No newline at end of file +# ] + diff --git a/api/serializers.py b/api/serializers.py index 82e82912..80eba627 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -1,5 +1,6 @@ -from rest_framework import serializers from . import models +from rest_framework import serializers +from inventory import models as inventory_models class CarVINSerializer(serializers.ModelSerializer): @@ -12,3 +13,71 @@ class CarVINSerializer(serializers.ModelSerializer): return models.CarVIN.objects.create(vin=vin, **validated_data) +class CarMakeSerializer(serializers.ModelSerializer): + car_models = serializers.PrimaryKeyRelatedField(many=True, read_only=True, source='carmodel_set') + + class Meta: + model = inventory_models.CarMake + fields = '__all__' + + +class CarModelSerializer(serializers.ModelSerializer): + car_series = serializers.PrimaryKeyRelatedField(many=True, read_only=True, source='carserie_set') + + class Meta: + model = inventory_models.CarModel + fields = '__all__' + + +class CarSerieSerializer(serializers.ModelSerializer): + car_trims = serializers.PrimaryKeyRelatedField(many=True, read_only=True, source='cartrim_set') + + class Meta: + model = inventory_models.CarSerie + fields = '__all__' + + +class CarTrimSerializer(serializers.ModelSerializer): + car_equipments = serializers.PrimaryKeyRelatedField(many=True, read_only=True, source='carequipment_set') + car_specification_values = serializers.PrimaryKeyRelatedField(many=True, read_only=True, + source='carspecificationvalue_set') + + class Meta: + model = inventory_models.CarTrim + fields = '__all__' + + +class CarEquipmentSerializer(serializers.ModelSerializer): + car_option_values = serializers.PrimaryKeyRelatedField(many=True, read_only=True, source='caroptionvalue_set') + + class Meta: + model = inventory_models.CarEquipment + fields = '__all__' + + +class CarSpecificationSerializer(serializers.ModelSerializer): + child_specifications = serializers.PrimaryKeyRelatedField(many=True, read_only=True, source='carspecification_set') + + class Meta: + model = inventory_models.CarSpecification + fields = '__all__' + + +class CarSpecificationValueSerializer(serializers.ModelSerializer): + class Meta: + model = inventory_models.CarSpecificationValue + fields = '__all__' + + +class CarOptionSerializer(serializers.ModelSerializer): + child_options = serializers.PrimaryKeyRelatedField(many=True, read_only=True, source='caroption_set') + + class Meta: + model = inventory_models.CarOption + fields = '__all__' + + +class CarOptionValueSerializer(serializers.ModelSerializer): + class Meta: + model = inventory_models.CarOptionValue + fields = '__all__' \ No newline at end of file diff --git a/api/urls.py b/api/urls.py index ae254510..a5713d5e 100644 --- a/api/urls.py +++ b/api/urls.py @@ -1,8 +1,22 @@ -from django.urls import path +from django.urls import path, include +from rest_framework import routers + from api import views +router = routers.DefaultRouter() +router.register(r'car-makes', views.CarMakeViewSet) +router.register(r'car-models', views.CarModelViewSet) +router.register(r'car-series', views.CarSerieViewSet) +router.register(r'car-trims', views.CarTrimViewSet) +router.register(r'car-equipments', views.CarEquipmentViewSet) +router.register(r'car-specifications', views.CarSpecificationViewSet) +router.register(r'car-specification-values', views.CarSpecificationValueViewSet) +router.register(r'car-options', views.CarOptionViewSet) +router.register(r'car-option-values', views.CarOptionValueViewSet) + urlpatterns = [ + path('', include(router.urls)), path('cars/vin/', views.CarVINViewSet.as_view(), name='car_vin'), path('login/', views.LoginView.as_view(), name='login'), - ] +] diff --git a/api/views.py b/api/views.py index 538a6175..d0c03086 100644 --- a/api/views.py +++ b/api/views.py @@ -1,5 +1,6 @@ +from django.db.models import Q from django.views.decorators.csrf import csrf_exempt -from rest_framework import permissions, status, viewsets +from rest_framework import permissions, status, viewsets, generics from rest_framework.views import APIView from rest_framework.response import Response from django.contrib.auth import authenticate @@ -7,8 +8,9 @@ from django.shortcuts import render from . import models, serializers from .services import get_car_data, get_from_cardatabase from rest_framework.authtoken.models import Token -# from inventory.models import CustomUser from django.utils.decorators import method_decorator +from inventory import models as inventory_models + class LoginView(APIView): @@ -51,3 +53,46 @@ class CarVINViewSet(APIView): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) +class CarMakeViewSet(viewsets.ModelViewSet): + queryset = inventory_models.CarMake.objects.filter(is_sa_import=True) + serializer_class = serializers.CarMakeSerializer + + +class CarModelViewSet(viewsets.ModelViewSet): + queryset = inventory_models.CarModel.objects.filter(id_car_make__is_sa_import=True) + serializer_class = serializers.CarModelSerializer + + +class CarSerieViewSet(viewsets.ModelViewSet): + queryset = inventory_models.CarSerie.objects.all() + serializer_class = serializers.CarSerieSerializer + + +class CarTrimViewSet(viewsets.ModelViewSet): + queryset = inventory_models.CarTrim.objects.all() + serializer_class = serializers.CarTrimSerializer + + +class CarEquipmentViewSet(viewsets.ModelViewSet): + queryset = inventory_models.CarEquipment.objects.all() + serializer_class = serializers.CarEquipmentSerializer + + +class CarSpecificationViewSet(viewsets.ModelViewSet): + queryset = inventory_models.CarSpecification.objects.all() + serializer_class = serializers.CarSpecificationSerializer + + +class CarSpecificationValueViewSet(viewsets.ModelViewSet): + queryset = inventory_models.CarSpecificationValue.objects.all() + serializer_class = serializers.CarSpecificationValueSerializer + + +class CarOptionViewSet(viewsets.ModelViewSet): + queryset = inventory_models.CarOption.objects.all() + serializer_class = serializers.CarOptionSerializer + + +class CarOptionValueViewSet(viewsets.ModelViewSet): + queryset = inventory_models.CarOptionValue.objects.all() + serializer_class = serializers.CarOptionValueSerializer diff --git a/inventory/__pycache__/models.cpython-311.pyc b/inventory/__pycache__/models.cpython-311.pyc index b6987177..ea4656a4 100644 Binary files a/inventory/__pycache__/models.cpython-311.pyc and b/inventory/__pycache__/models.cpython-311.pyc differ diff --git a/inventory/__pycache__/views.cpython-311.pyc b/inventory/__pycache__/views.cpython-311.pyc index b1e9ada4..e56b73c4 100644 Binary files a/inventory/__pycache__/views.cpython-311.pyc and b/inventory/__pycache__/views.cpython-311.pyc differ diff --git a/inventory/models.py b/inventory/models.py index f78ae7fd..d05bb82b 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -452,6 +452,10 @@ class Car(models.Model): "id": self.id, } + def get_specifications(self): + specs = CarSpecificationValue.objects.filter(id_car_trim=self.id_car_trim) + return specs + class CarTransfer(models.Model): car = models.ForeignKey( "Car", diff --git a/inventory/views.py b/inventory/views.py index dc91836e..6740f3f3 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -115,6 +115,28 @@ from django.core.files.storage import default_storage from plans.models import Plan,PlanPricing from django_ledger.utils import accruable_net_summary from appointment.views_admin import fetch_user_appointments +from django_ledger.views.financial_statement import ( + FiscalYearBalanceSheetView, + BaseIncomeStatementRedirectView, + FiscalYearIncomeStatementView, + BaseCashFlowStatementRedirectView, + FiscalYearCashFlowStatementView, +) +from django_ledger.views.entity import EntityModelDetailBaseView,EntityModelDetailHandlerView +from django.views.generic import DetailView, RedirectView + +from django_ledger.io.io_core import get_localdate +from django_ledger.models import EntityModel, EntityUnitModel +from django_ledger.views.mixins import ( + QuarterlyReportMixIn, + YearlyReportMixIn, + MonthlyReportMixIn, + DateReportMixIn, + DjangoLedgerSecurityMixIn, + EntityUnitMixIn, + BaseDateNavigationUrlMixIn, + PDFReportMixIn, +) logger = logging.getLogger(__name__) @@ -2649,6 +2671,7 @@ class PaymentRequest(LoginRequiredMixin, DetailView): models.Car.objects.get(vin=car.item_model.name) for car in context["estimate"].get_itemtxs_data()[0].all() ] + return context @@ -2957,7 +2980,7 @@ def PaymentCreateView(request, pk): try: if invoice: set_invoice_payment(dealer, entity, invoice, amount, payment_method) - elif bill: + elif bill: set_bill_payment(dealer, entity, bill, amount, payment_method) messages.success(request, "Payment created successfully!") return redirect(redirect_url, pk=model.pk) @@ -3094,6 +3117,7 @@ def lead_create(request): return render(request, "crm/leads/lead_form.html", {"form": form}) + class LeadUpdateView(UpdateView): model = models.Lead form_class = forms.LeadForm @@ -3105,6 +3129,8 @@ class LeadUpdateView(UpdateView): form.fields["id_car_model"].queryset = form.instance.id_car_make.carmodel_set.all() return form + +@login_required def LeadDeleteView(request,pk): lead = get_object_or_404(models.Lead, pk=pk) lead.delete() @@ -3278,7 +3304,7 @@ def add_activity_to_lead(request, pk): return render(request, "crm/add_activity.html", {"form": form, "lead": lead}) -class OpportunityCreateView(CreateView): +class OpportunityCreateView(CreateView, LoginRequiredMixin): model = models.Opportunity form_class = forms.OpportunityForm template_name = "crm/opportunities/opportunity_form.html" @@ -3309,7 +3335,7 @@ class OpportunityCreateView(CreateView): return reverse_lazy("opportunity_detail", kwargs={"pk": self.object.pk}) -class OpportunityUpdateView(UpdateView): +class OpportunityUpdateView(UpdateView, LoginRequiredMixin): model = models.Opportunity form_class = forms.OpportunityForm template_name = "crm/opportunities/opportunity_form.html" @@ -3432,7 +3458,8 @@ class ItemServiceCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView) def form_valid(self, form): vat = models.VatRate.objects.get(is_active=True) - form.instance.dealer = get_user_type(self.request.user.dealer) + dealer = get_user_type(self.request) + form.instance.dealer = dealer if form.instance.taxable: form.instance.price = (form.instance.price * vat.rate) + form.instance.price return super().form_valid(form) @@ -3448,13 +3475,14 @@ class ItemServiceUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView) def form_valid(self, form): vat = models.VatRate.objects.get(is_active=True) - form.instance.dealer = get_user_type(self.request.user.dealer) + dealer = get_user_type(self.request) + form.instance.dealer = dealer if form.instance.taxable: form.instance.price = (form.instance.price * vat.rate) + form.instance.price return super().form_valid(form) -class ItemServiceListView(ListView): +class ItemServiceListView(ListView, LoginRequiredMixin): model = models.AdditionalServices template_name = "items/service/service_list.html" context_object_name = "services" @@ -3465,7 +3493,7 @@ class ItemServiceListView(ListView): return models.AdditionalServices.objects.filter(dealer=dealer).all() -class ItemExpenseCreateView(CreateView): +class ItemExpenseCreateView(CreateView, LoginRequiredMixin): model = ItemModel form_class = ExpenseItemCreateForm template_name = "items/expenses/expense_create.html" @@ -3484,7 +3512,7 @@ class ItemExpenseCreateView(CreateView): return super().form_valid(form) -class ItemExpenseUpdateView(UpdateView): +class ItemExpenseUpdateView(UpdateView, LoginRequiredMixin): model = ItemModel form_class = ExpenseItemUpdateForm template_name = "items/expenses/expense_update.html" @@ -3503,7 +3531,7 @@ class ItemExpenseUpdateView(UpdateView): return super().form_valid(form) -class ItemExpenseListView(ListView): +class ItemExpenseListView(ListView, LoginRequiredMixin): model = ItemModel template_name = "items/expenses/expenses_list.html" context_object_name = "expenses" @@ -3514,7 +3542,7 @@ class ItemExpenseListView(ListView): return dealer.entity.get_items_expenses() -class BillListView(ListView): +class BillListView(ListView, LoginRequiredMixin): model = BillModel template_name = "ledger/bills/bill_list.html" context_object_name = "bills" @@ -3606,6 +3634,7 @@ class ApprovedBillModelView(LoginRequiredMixin, UpdateView): return super().form_valid(form) +@login_required def bill_mark_as_approved(request, pk): bill = get_object_or_404(BillModel, pk=pk) if request.method == "POST": @@ -3619,6 +3648,7 @@ def bill_mark_as_approved(request, pk): return redirect("bill_detail", pk=bill.pk) +@login_required def bill_mark_as_paid(request, pk): bill = get_object_or_404(BillModel, pk=pk) if request.method == "POST": @@ -3668,6 +3698,7 @@ def bill_mark_as_paid(request, pk): # ) # form.instance.ledger = ledger # return super().form_valid(form) + @login_required def bill_create(request): dealer = get_user_type(request) @@ -3788,21 +3819,20 @@ def bill_create(request): return render(request, "ledger/bills/bill_form.html", context) +@login_required def BillDeleteView(request, pk): bill = get_object_or_404(BillModel, pk=pk) bill.delete() return redirect("bill_list") -class SubscriptionPlans(ListView): +class SubscriptionPlans(ListView, LoginRequiredMixin): model = models.SubscriptionPlan template_name = "subscriptions/subscription_plan.html" context_object_name = "plans" # orders - - class OrderListView(ListView): model = models.SaleOrder template_name = "sales/orders/order_list.html" @@ -3810,6 +3840,7 @@ class OrderListView(ListView): # email +@login_required def send_email_view(request, pk): estimate = get_object_or_404(EstimateModel, pk=pk) if request.method == "POST": @@ -3879,34 +3910,7 @@ def custom_bad_request_view(request, exception=None): return render(request, "errors/400.html", {}) -# from django_ledger.io.io_core import get_localdate -# from django_ledger.views.mixins import (DjangoLedgerSecurityMixIn) -# from django.views.generic import RedirectView -from django_ledger.views.financial_statement import ( - FiscalYearBalanceSheetView, - BaseIncomeStatementRedirectView, - FiscalYearIncomeStatementView, - BaseCashFlowStatementRedirectView, - FiscalYearCashFlowStatementView, -) -from django_ledger.views.entity import EntityModelDetailBaseView,EntityModelDetailHandlerView -from django.views.generic import DetailView, RedirectView - -from django_ledger.io.io_core import get_localdate -from django_ledger.models import EntityModel, EntityUnitModel -from django_ledger.views.mixins import ( - QuarterlyReportMixIn, - YearlyReportMixIn, - MonthlyReportMixIn, - DateReportMixIn, - DjangoLedgerSecurityMixIn, - EntityUnitMixIn, - BaseDateNavigationUrlMixIn, - PDFReportMixIn, -) -# BALANCE SHEET ----------- - - +# BALANCE SHEET class BaseBalanceSheetRedirectView(DjangoLedgerSecurityMixIn, RedirectView): def get_redirect_url(self, *args, **kwargs): year = get_localdate().year @@ -3916,23 +3920,23 @@ class BaseBalanceSheetRedirectView(DjangoLedgerSecurityMixIn, RedirectView): ) -class FiscalYearBalanceSheetViewBase(FiscalYearBalanceSheetView): +class FiscalYearBalanceSheetViewBase(FiscalYearBalanceSheetView,DjangoLedgerSecurityMixIn): template_name = "ledger/reports/balance_sheet.html" -class QuarterlyBalanceSheetView(FiscalYearBalanceSheetViewBase, QuarterlyReportMixIn): +class QuarterlyBalanceSheetView(FiscalYearBalanceSheetViewBase, QuarterlyReportMixIn, DjangoLedgerSecurityMixIn): """ Quarter Balance Sheet View. """ -class MonthlyBalanceSheetView(FiscalYearBalanceSheetViewBase, MonthlyReportMixIn): +class MonthlyBalanceSheetView(FiscalYearBalanceSheetViewBase, MonthlyReportMixIn, DjangoLedgerSecurityMixIn): """ Monthly Balance Sheet View. """ -class DateBalanceSheetView(FiscalYearBalanceSheetViewBase, DateReportMixIn): +class DateBalanceSheetView(FiscalYearBalanceSheetViewBase, DateReportMixIn, DjangoLedgerSecurityMixIn): """ Date Balance Sheet View. """ @@ -3941,7 +3945,7 @@ class DateBalanceSheetView(FiscalYearBalanceSheetViewBase, DateReportMixIn): # Income Statement ----------- -class BaseIncomeStatementRedirectViewBase(BaseIncomeStatementRedirectView): +class BaseIncomeStatementRedirectViewBase(BaseIncomeStatementRedirectView, DjangoLedgerSecurityMixIn): def get_redirect_url(self, *args, **kwargs): year = get_localdate().year dealer = get_user_type(self.request) @@ -3950,25 +3954,25 @@ class BaseIncomeStatementRedirectViewBase(BaseIncomeStatementRedirectView): ) -class FiscalYearIncomeStatementViewBase(FiscalYearIncomeStatementView): +class FiscalYearIncomeStatementViewBase(FiscalYearIncomeStatementView, DjangoLedgerSecurityMixIn): template_name = "ledger/reports/income_statement.html" class QuarterlyIncomeStatementView( - FiscalYearIncomeStatementViewBase, QuarterlyReportMixIn + FiscalYearIncomeStatementViewBase, QuarterlyReportMixIn, DjangoLedgerSecurityMixIn ): """ Quarter Income Statement View. """ -class MonthlyIncomeStatementView(FiscalYearIncomeStatementViewBase, MonthlyReportMixIn): +class MonthlyIncomeStatementView(FiscalYearIncomeStatementViewBase, MonthlyReportMixIn, DjangoLedgerSecurityMixIn): """ Monthly Income Statement View. """ -class DateModelIncomeStatementView(FiscalYearIncomeStatementViewBase, DateReportMixIn): +class DateModelIncomeStatementView(FiscalYearIncomeStatementViewBase, DateReportMixIn, DjangoLedgerSecurityMixIn): """ Date Income Statement View. """ @@ -3977,7 +3981,7 @@ class DateModelIncomeStatementView(FiscalYearIncomeStatementViewBase, DateReport # Cash Flow ----------- -class BaseCashFlowStatementRedirectViewBase(BaseCashFlowStatementRedirectView): +class BaseCashFlowStatementRedirectViewBase(BaseCashFlowStatementRedirectView, DjangoLedgerSecurityMixIn): def get_redirect_url(self, *args, **kwargs): year = get_localdate().year dealer = get_user_type(self.request) @@ -3986,12 +3990,12 @@ class BaseCashFlowStatementRedirectViewBase(BaseCashFlowStatementRedirectView): ) -class FiscalYearCashFlowStatementViewBase(FiscalYearCashFlowStatementView): +class FiscalYearCashFlowStatementViewBase(FiscalYearCashFlowStatementView, DjangoLedgerSecurityMixIn): template_name = "ledger/reports/cash_flow_statement.html" class QuarterlyCashFlowStatementView( - FiscalYearCashFlowStatementViewBase, QuarterlyReportMixIn + FiscalYearCashFlowStatementViewBase, QuarterlyReportMixIn, DjangoLedgerSecurityMixIn ): """ Quarter Cash Flow Statement View. @@ -3999,14 +4003,14 @@ class QuarterlyCashFlowStatementView( class MonthlyCashFlowStatementView( - FiscalYearCashFlowStatementViewBase, MonthlyReportMixIn + FiscalYearCashFlowStatementViewBase, MonthlyReportMixIn, DjangoLedgerSecurityMixIn ): """ Monthly Cash Flow Statement View. """ -class DateCashFlowStatementView(FiscalYearCashFlowStatementViewBase, DateReportMixIn): +class DateCashFlowStatementView(FiscalYearCashFlowStatementViewBase, DateReportMixIn, DjangoLedgerSecurityMixIn): """ Date Cash Flow Statement View. """ @@ -4014,7 +4018,7 @@ class DateCashFlowStatementView(FiscalYearCashFlowStatementViewBase, DateReportM # Dashboard -class EntityModelDetailHandlerViewBase(EntityModelDetailHandlerView): +class EntityModelDetailHandlerViewBase(EntityModelDetailHandlerView, DjangoLedgerSecurityMixIn): def get_redirect_url(self, *args, **kwargs): loc_date = get_localdate() @@ -4036,7 +4040,7 @@ class EntityModelDetailHandlerViewBase(EntityModelDetailHandlerView): }) -class EntityModelDetailBaseViewBase(EntityModelDetailBaseView): +class EntityModelDetailBaseViewBase(EntityModelDetailBaseView, DjangoLedgerSecurityMixIn): template_name = "ledger/reports/dashboard.html" def get_context_data(self, **kwargs): @@ -4066,31 +4070,30 @@ class EntityModelDetailBaseViewBase(EntityModelDetailBaseView): return context -class FiscalYearEntityModelDashboardView(EntityModelDetailBaseViewBase): +class FiscalYearEntityModelDashboardView(EntityModelDetailBaseViewBase, DjangoLedgerSecurityMixIn): """ Entity Fiscal Year Dashboard View. """ -class QuarterlyEntityDashboardView(FiscalYearEntityModelDashboardView, QuarterlyReportMixIn): +class QuarterlyEntityDashboardView(FiscalYearEntityModelDashboardView, QuarterlyReportMixIn, DjangoLedgerSecurityMixIn): """ Entity Quarterly Dashboard View. """ -class MonthlyEntityDashboardView(FiscalYearEntityModelDashboardView, MonthlyReportMixIn): +class MonthlyEntityDashboardView(FiscalYearEntityModelDashboardView, MonthlyReportMixIn, DjangoLedgerSecurityMixIn): """ Monthly Entity Dashboard View. """ -class DateEntityDashboardView(FiscalYearEntityModelDashboardView, DateReportMixIn): +class DateEntityDashboardView(FiscalYearEntityModelDashboardView, DateReportMixIn, DjangoLedgerSecurityMixIn): """ Date-specific Entity Dashboard View. """ - class PayableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View): http_method_names = ['get'] @@ -4120,6 +4123,7 @@ class PayableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View): 'message': 'Unauthorized' }, status=401) + class ReceivableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View): http_method_names = ['get'] @@ -4150,6 +4154,7 @@ class ReceivableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View): 'message': 'Unauthorized' }, status=401) + class PnLAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View): http_method_names = ['get'] diff --git a/templates/sales/estimates/payment_request_detail.html b/templates/sales/estimates/payment_request_detail.html index 8b8e59b9..753999bd 100644 --- a/templates/sales/estimates/payment_request_detail.html +++ b/templates/sales/estimates/payment_request_detail.html @@ -1,21 +1,24 @@ +{% load i18n custom_filters num2words_tags %} - عرض سعر السيارة - Tenhall + عرض سعر / Quotation -
-
-

عرض سعر السيارة - Tenhal

-
+
+

عرض سعر السيارة - Tenhal

-
-

المكرمين/

- -
+

المكرمين/

+ -

السلام عليكم و رحمة الله و بركاته،

+

السلام عليكم ورحمة الله وبركاته،

-

بناء على طلبكم، نورد لكم عرض سعر للسيارة وهو يعد إيجابا منا بالبيع:

+

بناءً على طلبكم، نورد لكم عرض سعر للسيارة وهو يعد إيجابًا منا بالبيع:

- - - - - - + + + + + + + + {% for car in cars %} - - - + + + + + + + {% endfor %} - +
نوع السيارةاللون الخارجياللون الداخلي
نوع السيارةاللون الخارجياللون الداخلي
{{ car.year }} - {{ car.id_car_make.arabic_name }} - {{ car.id_car_model.arabic_name }} - {{ car.id_car_trim.arabic_name }}{{ car.colors.first.exterior.arabic_name }}{{ car.colors.first.interior.arabic_name }}{{ car.finances.first.cost_price }}{{ car. }}
-
-

حمولة المركبة (

- -

) سنة الصنع (

- -

) (جديد / مستعملة) كلم/ميل

-
+

حمولة المركبة () سنة الصنع () (جديد / مستعملة) كلم/ميل

-
-

مستوى اقتصاد الوقود (

- -

) رقم الشاسيه "في حال كانت السيارة مستعملة فقط" (

- -

)

-
+

مستوى اقتصاد الوقود () رقم الشاسيه (في حال كانت السيارة مستعملة فقط) ()

-
-

مواصفات أخرى:

- -
+

مواصفات أخرى:

+ + + + + + + + + - - - - - - - - + + + + + + +
سعر السيارة الأساسيمبلغ ضريبة القيمة المضافة (15% VAT)إجمالي سعر السيارة مع الضريبة
سعر السيارة الأساسيمبلغ ضريبة القيمة المضافة (15% VAT)إجمالي سعر السيارة مع الضريبة
{{ cars }}
{{ estimate.get_cost_estimate }}{{ estimate.get_invoiced_amount.invoice_amount_paid__sum }}
-

إجمالي سعر السيارة مع الضريبة كتابة: ريالا سعوديا فقط لا غير

+

الإجمالي مع الضريبة كتابةً: {{ estimate.get_invoiced_amount.invoice_amount_paid__sum|num_to_words }} {{ CURRENCY }} فقط لا غير

-
-

مدة الضمان:

- -

شهرا، أو

- -

كيلومترا /ميل (أيهما يأتي أولا)

-
+

مدة الضمان: شهراً، أو كيلومتراً / ميلاً (أيهما يأتي أولاً)

-
-

ملاحظات:

- -
+

ملاحظات:

+ -
-

اسم الشركة/ الوكالة:

- -
+

اسم الشركة / الوكالة:

+ -
-

العنوان: المدينة شارع

- -
+

العنوان: المدينة - شارع:

+ -
-

ص.ب رمز بريدي الهاتف:

- -
+

ص.ب / رمز بريدي / الهاتف:

+
-
-

الموظف المسؤول التوقيع:

- -
-
-

التاريخ:

- -

/

- -

/

- -

م الختم

-
+

الموظف المسؤول:

+ +

التوقيع:

+ +

التاريخ: / /

diff --git a/templates/sales/sales_list.html b/templates/sales/sales_list.html index 18ed8ae9..f905d369 100644 --- a/templates/sales/sales_list.html +++ b/templates/sales/sales_list.html @@ -46,7 +46,7 @@
Loading...