graficos y nuevo index

main
Francisco_Borja 12 months ago
parent fd44e90e11
commit fcdd6c7f00
  1. BIN
      Inventario/__pycache__/forms.cpython-313.pyc
  2. BIN
      Inventario/__pycache__/views.cpython-313.pyc
  3. 7
      Inventario/forms.py
  4. 162
      Inventario/templates/index.html
  5. 55
      Inventario/views.py
  6. BIN
      TiendAlfa/__pycache__/urls.cpython-313.pyc
  7. 4
      TiendAlfa/urls.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'}),
}

@ -2,7 +2,169 @@
{% block content %}
{% if user.is_authenticated %}
<div class="container my-4">
<h1 class="text-center mb-4">Dashboard - Inventario y Ventas</h1>
<!-- Fila de los resúmenes de datos -->
<div class="row mb-4">
<!-- Resumen de total de ventas -->
<div class="col-md-3 mb-3">
<div class="card bg-primary text-white">
<div class="card-body">
<h5 class="card-title">Total de Ventas</h5>
<p class="card-text">
<strong>${{ total_ventas|floatformat:2 }}</strong>
</p>
</div>
</div>
</div>
<!-- Resumen de productos en inventario -->
<div class="col-md-3 mb-3">
<div class="card bg-success text-white">
<div class="card-body">
<h5 class="card-title">Productos en Inventario</h5>
<p class="card-text">
<strong>{{ total_productos_en_inventario }}</strong>
</p>
</div>
</div>
</div>
<!-- Resumen de artículos vendidos -->
<div class="col-md-3 mb-3">
<div class="card bg-warning text-dark">
<div class="card-body">
<h5 class="card-title">Artículos Vendidos</h5>
<p class="card-text">
<strong>{{ total_articulos_vendidos }}</strong>
</p>
</div>
</div>
</div>
<!-- Resumen de proveedores -->
<div class="col-md-3 mb-3">
<div class="card bg-info text-white">
<div class="card-body">
<h5 class="card-title">Proveedores</h5>
<p class="card-text">
<strong>{{ total_proveedores }}</strong>
</p>
</div>
</div>
</div>
</div>
<!-- Fila para organizar los gráficos -->
<div class="row">
<!-- Gráfico Ventas por Bodega -->
<div class="col-md-6 mb-4">
<h4 class="text-center">Ventas por Bodega</h4>
<canvas id="ventasPorBodega"></canvas>
</div>
<!-- Gráfico Inventario Total -->
<div class="col-md-6 mb-4">
<h4 class="text-center">Inventario Total</h4>
<canvas id="inventarioTotal"></canvas>
</div>
</div>
<div class="row">
<!-- Gráfico Ventas por Artículo -->
<div class="col-md-6 mb-4">
<h4 class="text-center">Ventas por Artículo</h4>
<canvas id="ventasPorArticulo"></canvas>
</div>
<!-- Gráfico Precios de Artículos -->
<div class="col-md-6 mb-4">
<h4 class="text-center">Precios de Artículos</h4>
<canvas id="preciosArticulos"></canvas>
</div>
</div>
</div>
<script>
// Ventas por bodega
const ventasPorBodega = {{ ventas_por_bodega|safe }};
const bodegaLabels = ventasPorBodega.map(item => item.bodega__nombre_bodega);
const bodegaData = ventasPorBodega.map(item => item.total_ventas);
new Chart(document.getElementById('ventasPorBodega'), {
type: 'bar',
data: {
labels: bodegaLabels,
datasets: [{
label: 'Ventas Totales',
data: bodegaData,
backgroundColor: 'rgba(75, 192, 192, 0.2)',
borderColor: 'rgba(75, 192, 192, 1)',
borderWidth: 1
}]
}
});
// Inventario total por artículo
const inventarioTotal = {{ inventario_total|safe }};
const inventarioLabels = inventarioTotal.map(item => item.articulo__nombre_articulo);
const inventarioData = inventarioTotal.map(item => item.total);
new Chart(document.getElementById('inventarioTotal'), {
type: 'pie',
data: {
labels: inventarioLabels,
datasets: [{
label: 'Inventario Total',
data: inventarioData,
backgroundColor: ['#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0'],
}]
}
});
// Ventas por artículo
const ventasPorArticulo = {{ ventas_por_articulo|safe }};
const articuloLabels = ventasPorArticulo.map(item => item.articulo__nombre_articulo);
const articuloData = ventasPorArticulo.map(item => item.total);
new Chart(document.getElementById('ventasPorArticulo'), {
type: 'line',
data: {
labels: articuloLabels,
datasets: [{
label: 'Unidades Vendidas',
data: articuloData,
borderColor: 'rgba(153, 102, 255, 1)',
borderWidth: 2
}]
}
});
// Comparación de precios de artículos
const preciosArticulos = {{ precios_articulos|safe }};
const precioLabels = preciosArticulos.map(item => item.nombre_articulo);
const precioCompraData = preciosArticulos.map(item => item.precio_compra);
const precioVentaData = preciosArticulos.map(item => item.precio_venta);
new Chart(document.getElementById('preciosArticulos'), {
type: 'bar',
data: {
labels: precioLabels,
datasets: [
{
label: 'Precio de Compra',
data: precioCompraData,
backgroundColor: 'rgba(255, 99, 132, 0.2)',
borderColor: 'rgba(255, 99, 132, 1)',
borderWidth: 1
},
{
label: 'Precio de Venta',
data: precioVentaData,
backgroundColor: 'rgba(54, 162, 235, 0.2)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 1
}
]
}
});
</script>
{% else %}
{% endif %}

@ -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',{

@ -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'),

Loading…
Cancel
Save