From fcdd6c7f00d832b2ce4bcb7ac0488a2a6413ddac Mon Sep 17 00:00:00 2001 From: Francisco_Borja Date: Wed, 18 Dec 2024 19:05:40 -0600 Subject: [PATCH] graficos y nuevo index --- Inventario/__pycache__/forms.cpython-313.pyc | Bin 9945 -> 9789 bytes Inventario/__pycache__/views.cpython-313.pyc | Bin 14559 -> 16799 bytes Inventario/forms.py | 7 +- Inventario/templates/index.html | 162 +++++++++++++++++++ Inventario/views.py | 55 +++++++ TiendAlfa/__pycache__/urls.cpython-313.pyc | Bin 3275 -> 3286 bytes TiendAlfa/urls.py | 4 +- 7 files changed, 221 insertions(+), 7 deletions(-) diff --git a/Inventario/__pycache__/forms.cpython-313.pyc b/Inventario/__pycache__/forms.cpython-313.pyc index 6fd3fffbea490b0fc45502f483fab3d2601d9693..9e6a6bb7a4953d5d04eb9013b86282d41226b5af 100644 GIT binary patch delta 494 zcmccVyVr;BGcPX}0}z}_N=|Q;-^i!LZCkpB}SW87vH!Otv=g_9-30+?3vPF^T4 zC7KLWS;PS%Qb0s1h)A0}Q%s312gJ;od{Ar)W6op&9?8x9;%6Bd^Crhinla{Yo+9bO z$d&|BlDPSv)H-IylF7YtdW^-B_sIQ+7z%O(vZ0$V$X7CMP8U{Y6yyv`%_~WC%P-1( zSpZT6GE_zk;*3C$Kt6~F0}*VKKXOVk7EEs77v<1r2xbao1PU3jOHa1vvP|_j60gm4eJx1rdfI!U#l6 ufe{6hkBTj1=VD{!`oh3AdAn*lF!1HomJ16qa!p{J&Oed=D+7=T)(HS=9D<|( delta 538 zcmdn%bJLgaGcPX}0}y1YC#CZ#Y~)koXI#12kpB}SWBg_n!Otv=MUy4O0w$l56Q5i! z#wwZuR9eIVB2qy_8i+`rJX1`GEf>VhoqSMi3uEqN0UpWC{o-dC8S^K{N}4eiY@Q0b_&5cP>^|t}hI%lciPDf$`L= Yx?EUzwx8{MJ5FpT#*X8VJVug*B&4)~hOt7ReAcxfgx0*+kJQw84)-}J zr5^@$Q^O|OvRi3T+QPJIf=aE}^3SGKQ#5IRRI4UiMlyRs>L2^)q-hcqq-ki?cFukN z0z$?tz4Pun_uO;O`JHpmx&HFl#W(o6+qJbe4t`!WI{o;Dvvn@sbGG}N>QIx14)A{( zJ>(2^c(`GdfFIcy3V1lODbxw{$xsmJ7)W$gNNf(R2JUyJyQQARv8u0m{w^I9l6(*S zsnAP5?YCAP7U&-uI%&h8vuc>9Z?${UlU74J$Ay4pj6>BMc$E+H4sLuk$Ej75_M*&W zZE+N?3JE6o*vR)3Sg|UO^K&6nQA_cSlHDM)3k2;TF{45Y0gTgX0KZE%Y!Ra4jmu5DkzHQOV*W<%E= z0+4<9k=584LQgYhwJ2L(&|Q+K zoh3>%o{U73GwE3(>otXMwhL@pZ)`eClCimHDyfk{Py_tBk}&B)ze;a9&Yj zNup>Zh*s8-0779&P90UEDNQ%e%ZWKf)6=4?s(^J$A$XW|(~(3{PLU=U6CW~!L|jXe zRXDWD)6)ck1+o}a-4spEsVRcTU9uA>T^zyUsSELxGDFtm_Xv{5kg(8gz|rGKo&cg- zqRF(HQjVuIta$$NkKpmtYp02PBpyv_k@>jt5_t-EcmOmWGTEM|p;7F?K|OOX)p4&h`okdxe>1>3^N_x9YdJKouvv$ti0HZbX`Wq@zr2Jydq4( zCp{HtpxeM?&w7CzkRIDo*wi5U*baWZ;i$@++m6DI1YHKx}0?xI?585X9 ztt@Fxtfw0lqfS#2a4U!qB>~4Swi3c=+!)DU>8N*eA&KutxVhxR1K{G)6LkuK3g%~% zadrB^B**IpVLm<*&VfP&slRVu@_o?rcX+gO^sw7WPx;<7Kwk{_{XDb!uCsitx~E8^ z1(^8I7g$^@Gm5IoM-}5Bm@5jm8%4{pIDnrgft2uvvF@nYrjYkFNpc#d?xN^>tcd@m z;~>Ai5FH<|jeLItM-Q(ndgWcy$eAC)ih7USq*D0#k+ey{Y~#$iS;`V?tCQ9oB;i-ZIqpUmpb~^HZgOs zOF)e+G{t>=U9H`?)Q%lMHnfwU0cX?VnZBheeh=L};7McAW}({6!YA2`fR$tQ6Vy=? zO(?Re#3ImcWP;9=JC{+#&jC*|msx z7wcZ(`7`v@!N3!R$adg5R>}THWXWZeL^4bNIQU(-tgIS3KX7jig!E*55U;m9Ri zi)4=eZD_zE!DzR%Wzj!8&!>BE4zJVfCd4i^>^{Nn0j%p1YO1zK8llKJM& zx#ymr@18k#Ze3t*w^uN_5Pnnuk_Ae%7=SzE^w7H|q^ZyJ<#}c$nRd%ytGO z7@O@v9G~5Zco20$WgQ7(v)w42NcG5JbIS1tV+(wrQ)gkm=Il3@Yh~t&pe^Xd!RUSggDF3xFiqV}89HHpW`bIFiRbO!N8JvV&1cM0jV|JXCBxofN z!HTel>2*JWAmadz)||qp<<2R_xww|JDsu{`im+#pRuC_nF*zYfX3~(2(}1HuCR%~{QUl)ptY`O zy3FZuTswoeah*8jzxyw;ah_?pIub*n?1UZofC++00+Ig{I4ToM(qko<;{$=gBDsr{ z3rrClMp*C`UE4|9X+2$92+z{!2*M`fg?EwO!-$7zTyr18wZfA}i5K}ji7F|+cgHPu zv{aPU?d^-S*T^ZNRh`q$>+u4XnF24M03P7DnWT^6n9NjV)tBOA%Ajz|J6nhm`3<<5>Xf@Gn(HOa!2 z$nXD%RII{zz4gou%kR%-@?D>`dgI1LZbpXEs;;__ZPI~DbGBLdOu~k z1@)!xoc3{JIa&=RvvupeLq(;V=JC)8HWkC6TnX*?5DZ%$Lrr4~LFF`lj>$(=dV&@a zyvzUUo+wuOCdO}s11`aMg1;ATsw$N<|2*s;+aigr>bI^Gf2n{qbof5+>|M2~HNWc( zQt!Gaw~8VbC5!!;h_KulHESqmRl9^;8@g=^#l9W_wJk^@Y~rp_%NEoueg>MpPF@DJ zJ|)e!5tgK%+@9Ajy>jVB{%bc+hpNn5eJ9ydF`PnHJMdxGZHh(@ZyHwp22b|(>$u`u ziBCpiNbKdvor-F!DxqX^T2e{!eM9Xv^JEeT3_dq>n@#YB=wK5`Er*u0XGB{2`LXB; z*28Z{hh3L(`g_UzIqGw|DSK+8j*%Ce1Y6tE^v%ab$_4;8Mk2B}p918C)U7Jbh!>PJ z+7~T{!|J%oQ1nU)s*+vrksbBDtk78JgPnj5PUUZeE{0Ez!9$p8QV diff --git a/Inventario/forms.py b/Inventario/forms.py index 1c0b469..92c19bd 100644 --- a/Inventario/forms.py +++ b/Inventario/forms.py @@ -119,14 +119,11 @@ class VentaForm(forms.ModelForm): empty_label="Selecciona una bodega", widget=forms.Select(attrs={'class': 'btn btn-secondary dropdown-toggle ', 'data-bs-toggle': 'dropdown', 'aria-expanded': 'false'}), label="bodega") - cantidad=forms.DecimalField( - label="cantidad", - max_digits=10, - decimal_places=2, - widget=forms.NumberInput(attrs={'class': 'form-control', 'placeholder': 'Escribe un decimal'})) + class Meta: model = Venta fields = ['bodega', 'articulo', 'cantidad', 'observaciones'] widgets={ + 'cantidad': forms.NumberInput(attrs={'class': 'form-control', 'placeholder': 'Escribe un decimal'}), 'observaciones': forms.Textarea(attrs={'class':'form-control','placeholder':'describa el producto','rows':'5'}), } diff --git a/Inventario/templates/index.html b/Inventario/templates/index.html index 884fb63..f8118c9 100644 --- a/Inventario/templates/index.html +++ b/Inventario/templates/index.html @@ -2,7 +2,169 @@ {% block content %} {% if user.is_authenticated %} +
+

Dashboard - Inventario y Ventas

+ +
+ +
+
+
+
Total de Ventas
+

+ ${{ total_ventas|floatformat:2 }} +

+
+
+
+ +
+
+
+
Productos en Inventario
+

+ {{ total_productos_en_inventario }} +

+
+
+
+ +
+
+
+
Artículos Vendidos
+

+ {{ total_articulos_vendidos }} +

+
+
+
+ +
+
+
+
Proveedores
+

+ {{ total_proveedores }} +

+
+
+
+
+ + +
+ +
+

Ventas por Bodega

+ +
+ +
+

Inventario Total

+ +
+
+ +
+ +
+

Ventas por Artículo

+ +
+ +
+

Precios de Artículos

+ +
+
+
+ + {% else %} {% endif %} diff --git a/Inventario/views.py b/Inventario/views.py index cc15510..ee91729 100644 --- a/Inventario/views.py +++ b/Inventario/views.py @@ -18,6 +18,61 @@ def base(request): return render(request, 'index.html') +def graficos_view(request): + # 1. Ventas por bodega + ventas_por_bodega = ( + Venta.objects.values("bodega__nombre_bodega") + .annotate(total_ventas=Sum("total")) + ) + for item in ventas_por_bodega: + item["total_ventas"] = float(Decimal(item["total_ventas"] or 0)) # Convertir a float + + # 2. Inventario total por artículo + inventario_total = ( + inventario.objects.values("articulo__nombre_articulo") + .annotate(total=Sum("cantidad")) + ) + + # 3. Ventas por artículo + ventas_por_articulo = ( + Venta.objects.values("articulo__nombre_articulo") + .annotate(total=Sum("cantidad")) + ) + + # 4. Comparación de precios de artículos + precios_articulos = list(articulo.objects.values( + "nombre_articulo", + "precio_compra", + "precio_venta", + )) + for item in precios_articulos: + item["precio_compra"] = float(Decimal(item["precio_compra"] or 0)) # Convertir a float + item["precio_venta"] = float(Decimal(item["precio_venta"] or 0)) # Convertir a float + + # Calcular el total de ventas + total_ventas = Venta.objects.aggregate(total_ventas=Sum('total'))['total_ventas'] or Decimal(0) + + # Calcular el total de productos en inventario + total_productos_en_inventario = inventario.objects.aggregate(total_productos=Sum('cantidad'))['total_productos'] or 0 + + # Calcular el total de artículos vendidos + total_articulos_vendidos = ventas_por_articulo.aggregate(total_vendidos=Sum('total'))['total_vendidos'] or 0 + + # Calcular el total de proveedores + total_proveedores = proveedor.objects.count() + + context = { + "ventas_por_bodega": list(ventas_por_bodega), + "inventario_total": list(inventario_total), + "ventas_por_articulo": list(ventas_por_articulo), + "precios_articulos": precios_articulos, + "total_ventas": float(total_ventas), # Sumar todas las ventas totales + "total_productos_en_inventario": total_productos_en_inventario, # Número total de productos en inventario + "total_articulos_vendidos": total_articulos_vendidos, # Total de unidades vendidas + "total_proveedores": total_proveedores, # Número de proveedores + } + + return render(request, "index.html", context) def signin(request): if request.method == 'GET': return render ( request, 'signin.html',{ diff --git a/TiendAlfa/__pycache__/urls.cpython-313.pyc b/TiendAlfa/__pycache__/urls.cpython-313.pyc index 0b4ef3a2ef8973438035a89825cea3404e84783e..5bfef84d6e54b489a8afac4ee0e77e49b0cf3ab6 100644 GIT binary patch delta 72 zcmX>tc}=R3wPlW%b82tH)t=n(2~?f2^R Qnvr&qMfK)paqj($0AyMfIRF3v diff --git a/TiendAlfa/urls.py b/TiendAlfa/urls.py index e68c6f0..0cda0c8 100644 --- a/TiendAlfa/urls.py +++ b/TiendAlfa/urls.py @@ -20,8 +20,8 @@ from Inventario import views, viewspdf urlpatterns = [ path('admin/', admin.site.urls), -# path('',views.generar_grafico_chartjs, name='home'), - path('',views.base, name ='home'), + path('',views.graficos_view, name='home'), +# path('',views.base, name ='home'), path('logout/',views.signout, name ='logout'), path('signin/',views.signin, name ='signin'), path('proveedor/',views.proveedor_lista, name ='proveedor'),