From 41e1a7d472e5f49a0fda9acdce3bc946dcbac7c1 Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Wed, 12 Feb 2025 18:26:04 +0300 Subject: [PATCH 1/3] update --- api/__pycache__/serializers.cpython-311.pyc | Bin 1201 -> 6654 bytes api/__pycache__/urls.cpython-311.pyc | Bin 588 -> 1860 bytes api/__pycache__/views.cpython-311.pyc | Bin 4096 -> 7943 bytes api/routing.py | 3 +- api/serializers.py | 71 +++++- api/urls.py | 18 +- api/views.py | 49 +++- inventory/__pycache__/models.cpython-311.pyc | Bin 89130 -> 89413 bytes inventory/__pycache__/views.cpython-311.pyc | Bin 189249 -> 189408 bytes inventory/models.py | 4 + inventory/views.py | 129 +++++------ .../estimates/payment_request_detail.html | 210 +++++++----------- templates/sales/sales_list.html | 45 ++-- 13 files changed, 302 insertions(+), 227 deletions(-) diff --git a/api/__pycache__/serializers.cpython-311.pyc b/api/__pycache__/serializers.cpython-311.pyc index 9e4507472eab5e27fbff66aeb5e99570f8f68c60..d662ba3535889843c5f2b1ea16600b996c7e542a 100644 GIT binary patch literal 6654 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 Qa-1Z&*ltGr*gQ7pU-&h^od5s; delta 315 zcmX@YcZMZmIWI340}y=q@1K4SNIwQ~V1NzE_`C_on9h*GkiwY5kjogw$OvLH)pFfpVurZA^6XR*LEE?}Mfkx_W^PbL9XmNl%)m>C#W12F`ERkHzA!%SyDs5WFr zSDnrj#h$_u%%I8n5~N*|@fJ%#Vo3&&W-ZH1EiayYhgnya;}&;HR$^XyzFuijPH_>) zs$0y71(`)42Thh^ZL}5yG8lolxEe@&U}j`wyul!I0Tta~5WRqkK5#Iwa!&rl=FHE^ O%+J=q4T44dKobCk@IwCp diff --git a/api/__pycache__/views.cpython-311.pyc b/api/__pycache__/views.cpython-311.pyc index 85e62eba1f62349761886bbeda314e158edcb8d6..38bd7efa7008e2770e10ea5b6857c4e0232aaba8 100644 GIT binary patch literal 7943 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 delta 1143 zcmZ`%&u`O85Z;Xw$ITDNX_}Iz2?S7qKq)P%1Qk4Zg@zvoQktYa_&_kRDFJU&jh*sT z>8Tu$;K1Rb72*#-f`>rjP$BUbaNtylOXU++Zas5>olTL55UcgKGyBcX&VHUp=N^>w zSIK0Ih+&cI%T?{Ep4<2+yywIwHgyT3CZ%YH+z?Ytg@w&9ixVYbKI zLrI8SCU)W>v6D{pr9#LX@%4t8lbkNN)NkB~ZPZCQ{S`yYG>Er6xZQOAaoDO~R`^C} zAOAn}-{yJcW+)lKkPu|W0>k`mWO^RWvL1wO%eMk$+3`U`5(9&wD~-nW=Je!b^TO<0 zvsPJHtkfGYfK+yunrbdqXBQh+=4)5Y${ZN{ggQpEd{Lb=dY53b5rjN{rmoWTrW#c! z4fB|GVDy;Se@$Q<>7xjlpP=*0+Fz<9GJL@p*?gg`(7zLc4%CYlEM2Wa2_409T}Yy3 z^tS5`v@N&2?m+Jy1;LfWFeVl_#1~?Fi}IqP@YmD5BTH@Pe%F)GWK0-Ww|ra>a6(CzBOTW{X4zxF?Jd6 zP6zx}*Y_ZX2XpJJ4 zF5;;8yjg)eqU-23ncnK3+vN1tpXW9?veiGg$vD4J=nj49Pb0GKsQi0jn5T-@_}OAS HB6a-%HpT!N 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 b6987177233bf39d9655bd120837d9fa810b2943..ea4656a418a08d70b971e2d6bcfb5a617b542445 100644 GIT binary patch delta 6244 zcmai230#y%vZuab2ABaE7)A#~7!Wmsf`SJ|L_|^Xj7AI*6LEwAiNN4DgCgSfOpMCL ztJkz78q{5nM2+I8<9$WV#tSvN>cn^@ZggWjlDNhr`l|X<@nzk&{C@MNzwWB)>guZM z>i%qt`oK1Iz{-FCtr!0NZONK~pKAjW`ayG7YQM(b`n*=}dS$ns;Z+XVZ3cT;;#_$H zGlCZ!fQB%THR_qbv_1S;^^lOsI3^9SfP4;xSiI$%_)l&@&<_wquOwTr!=rYT+HxHZ z3EO6~+={w_3vA9D>MqPL%(XfT?In(ihTW}l{J-~qiQ*hhk!gz8xB6zM^l@kO?M~|3 zh3^SDl{V!@Mu|=bgXbzwvw}ICMfr(8os)jwxT-*bGW%}J=BGo>$pCnQ3+ej^PK9LAsH0Wg>o;+j-)6JR4xYX_mO>7|1J zHnFo~B4G>rZOmHmWh>-rjgVT$dN|%wpFmE3R_7Rp)An+{0(Gp^8Ld4^f(d?eEpqw- z996{aDtiL3m+cx?hnqUPJQ1K3+dG~?EE`g>3C^>$oDdc{Ar|6Tp9$-NuOq)lJJ#yV zu@>9QN}TdlBrr(wK4z{Ag|@Cvm2W|~2Z=1casit6g1#A>^;84&W4ot*q4^ie8Y(IKwB&!@eB*nPJ&d4|v>!?>Vc9bJoI_AQvx+{2qHhzO z(Do{|$V&Ap%Xip-Y0=s<)JYKHs+e{G;Eb?8>p1f~8!-JVzehNdi*El58&hOt?cZMu z1?;=`-;h+2@C)sIVka2RtTT4PeP#DL&Qt?DU|nX_=(NaOia+^x;8V>I&9qf5HBX33 zVrjEOS!PwEE>0TvCLrG*AgievL(8CV5pJ?C^%0DwhK4{4`bunSl8NoD^7x;7rVG-s zr8iA%_n-37*P4IO4o>n~^m%O{vQ5RGBc7#QGO)QH%#HHG&kB{r{E7_N!Ym-{x`0GQ z(&WLYWlNaOif6y&Uq2MAEI%*+d1Qie{5fjbQm2s_=PZ{3BoTV2=13G2XXYN(n2_Ml z62BP=&DpVeBT%o_^OIpA8$CZ$3BAoUTNpbuzrEf_QVC{})E!>zQcVPlV=KVuI>o{z zlz3;sPZ7~XwT%?rf>7b#&+2fRhm_`7owhuA2M-E@Z1x84?bjUX-1z&2-wA~fUfL2u zc|;gAVLQ|P_=qG(k>p=lr-hNIQue|wu$@&e+@*;n;TBxGft6M#!Y=lg>VA5${{5uq z)8Qx8rbJ2z@&@X360{=5KkQuu^${$>pW{7tvBu=Gel!-O2*pfyK3y}Yg)V$Av~jQ;iOBVhnLzCJlXIA94XjPve%Hg5o%T-#Sy zgyQ0HZrS>D7jM>%fkZZ9!x8DQa-wK^(zFD@u1wclka{Y<@Oa}<35|Zl9Sd#PJ@*!W z+CX_b!46=lLrm=JEqhV11zY>T>#j>%W5D?CGf6L`_312hdln33W47P&tHSX-G6WAw zf)F-w$0Qid9_?7vSh%inM!!Gx}AQ|!F6tD3vVr>NeJF&+I^o$OtI3w zeGkb+cI`Lm#uGsW!31`Bf3!Y@nnL+5)Di(1iYdv$c25st`3Ht;*J6JS>h(Mu1+be3 z%HXdo?;s`uVp=7foS>Yb8})T(w-2^~d9J80e~>g5>WN_u4#mP{_UfUHu#Me3)I(cK z-2|&x%Hi*z))jSR7z7@tUV_au=_nSsFOls$nhM9!iPo_-$98IV(Lf;^losilT{lY7 zULy{IgY!=whHK<(uB#_kgYGm9Y$Vv^`uJ2^(CLs<{)RdZvU8^wX?^IM;A_|9zqbU* zN5%AeOsvxp&W4@+M%$Ez3BG4t&s9iGmC;k@jszys2*C~fIl7ZB?3gD`N>quAYW!xt zsv{+Ok3P4|;j|aqptHgPl^}iV1{`odqRB|P)XC#dY{)zNCiQr{>o6R0y41^Tc;F3j?fw~8K z^ApV=hFLFNg@&xx3`m0z%mVueyR5RU`CxQ9BEr zxUv^Hu~$=oNy8?~joHa7$zh6DkXrRwSh(^)UYiaEeF{k<_!)nWxe^Z#hj3T^ca@Tq zq8Rnj)qIM%UHhB#DI+=K2%Z~4oC1ieek-fm~kSEjF6oQxAB<8vSvRKFK zak^nRds}ZLtWT0D?BI1H7F_4Am-#$hg;G^yk;(*-u1Wvg4N{h(XV#5>K8-e(eY0Vk z|EuAHfF8xx!Xk58UY=}oIE2FW`eK!zr=+L{H;s_P^tW28b8&*c{8$hkGH>6ig4fvf zTO*B`G<7(+OH%@ol(X1~+bsigXoMgcSK%1W8L<*gIa-ANgd9u0+~_ z94C!hB3guxy`VBX{IB5{da?IXFfoq07avXrM5nXUw8G!)#9N;{vYG#HI&C3#der@F z);zX%R=D37{G5;aJk4#{zm4`0&Vn8m6ln_eC&Kug9EVfR$@!4<4ny%%yw0*GkD9Qs z`&CfwT5*3nXcQ(^@X+$C`QgK8jo6emqCh?I&;X0s)rS|QGR1k%Jqm+Wu3sOGm7tQ1 zeqw1v(YOe@G|6+x6y?8%=JY}bW+?~W4Q0mleqfyZXNAOna9L@oU3Myb3q+?!{hD(WM)imE zrLst}A2tM7B#%#jo6T8RQXq3dtGE>T6;XQp2Ir2l<&_m-;kQtc<=5R_Tv}wKQm|U# zxI(sRC2%GQCU4D@M^ke+4N-u9DkRg!6j%QhN3ZdI{!nQo zGb?u*It`!g|F`}SuKR>K#M!rmdj~*9kT|kMp(#?_G8Kzz-AFr^$O!hhCk4PhfVpnm ztt!wcA<0kbp$lxG_}`*-A=yKU`V~;a%YvaVJmGtTVSwciYKVHgfSf~EgVM3QiRRhN zI~pKeyN=ofH{8<=UJn2qQGxa9E{w&oV-o3eNH6CTIpt`C${p zC8BCaN1P^(-7I=>PIA<&B7 z3xkqK5s2cVD1t(0E?C8qn(}uWLrfq@+iOhv-P_$ikvR=Xj+^_0KJ`JJ92l z;`D|3gI{S3vDzKTB@_6%8-~MUP*a=AW_Nr9lmZOrHIb0iQ1P;to()Fr0K3!Xi0^O1 zYWN6=`wD@tZw8IEb=XQ)W0!+ZF@r5+F@9TA9&N5{qw7u1$nkPNe%}m9kjfLHAk%n= z_{DM#Q_D!EImthYf{36K)bWD;Pj9X?nV7MS`&JZ$0(_-Jcyv?P3VIO|La30J&wq@8 z(6)l-9rOuLFot*G*g|Ka&5`p|DG^aGKL+&yX$tvxWwodI(q<5=K8q?0;>Vlegp2vC z<`CsCbR9^VouqvY<;RoxLtYAY_A;c7igSdD4*8~JkkYmw7cJngLzV85w29mWy+!u zu~PVrB_|!n6WV~`ExKmQHiU`>lw>K#4z$S*%&#w;tVCm_X(*-DmjD$3qGV}37K{?_e9sQkX?#fnjDbuZoCxXgjyo$6POA)b z`g=6RHs>gNo=ladY~!gNpskX8viZ>tkgT~+tJhF<*oZevg6Vj*7<=-w#*u2O7xn-)jV*}bD9ZVud5T(?ap^ke;VBg%#30eAV( zWN7(Jfs4ry0N(tkWN4xD!Fpgcy2{g4Mzd~H<9JDD2=Eo*CL!yz&d?t0d~0Xu6)$ET zN;~p^=C6Nxx=Wu~G@wR_B74YM9+d`7v?}T#u<{`(a6?jg(=~t(>jE1wL+DdsmuDB^a-=k&&Rcm;}a=y3^G=j~1Qy=J&Bt}A%04f=4FT|Qh z#J3l5kd-~Yx%T2>TZz*lM++&m%iVZFUof>L1?6;7prtYawrc5f0|M1%UR{;vG+_XO zDelU?fLDEkyK8?4mL`jbUhyb%L9r!FJ4A_(Y_MLe2_=LqqBAa3(=b5cj# zUPWCdDmZcT6lbZplVJJeNAf8B6DrIB7(-7FkOq5ZOk$ y39l4xCfviog9btq=;CfY5N3O~>m~s{mA@QkH2+hpJ7VnD7b!B_cQWBspZ^8)QpxlH delta 5942 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 B)_ec} delta 43220 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 Ul>6~`i_W$3UtefrgW$pZKhH7l+W-In 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...
@@ -1353,7 +1187,7 @@
-

768kB| Shantinan Mekalan | 21st Dec, 12:56 PM

+

768kB| Shantinan Mekalan | 21st Dec, 12:56 PM

diff --git a/templates/sales/estimates/estimate_detail.html b/templates/sales/estimates/estimate_detail.html index b5a9a3e4..125b9a13 100644 --- a/templates/sales/estimates/estimate_detail.html +++ b/templates/sales/estimates/estimate_detail.html @@ -6,23 +6,25 @@ {% block content %}