diseño v2.5

main
FranciscoBorja12 12 months ago
parent a33e02d415
commit 68f5cf31df
  1. 96
      Inventario/templates/Base.html
  2. 40
      Inventario/templates/articulo_nuevo.html
  3. 86
      Inventario/templates/articulo_registro.html
  4. 37
      Inventario/templates/articulo_update.html
  5. 37
      Inventario/templates/bodega_nuevo.html
  6. 85
      Inventario/templates/bodega_registro.html
  7. 38
      Inventario/templates/bodega_update.html
  8. 80
      Inventario/templates/grafico_chartjs.html
  9. 4
      Inventario/templates/index.html
  10. 41
      Inventario/templates/inventario_nuevo.html
  11. 81
      Inventario/templates/inventario_registro.html
  12. 71
      Inventario/templates/mov_inventario_registro.html
  13. 35
      Inventario/templates/nueva_venta.html
  14. 192
      Inventario/templates/pdf.html
  15. 40
      Inventario/templates/proveedor_nuevo.html
  16. 76
      Inventario/templates/proveedor_registro.html
  17. 40
      Inventario/templates/proveedor_update.html
  18. 46
      Inventario/templates/reporte_pdf.html
  19. 45
      Inventario/templates/signin.html
  20. 39
      Inventario/templates/tipo_articulo_nuevo.html
  21. 69
      Inventario/templates/tipo_articulo_registro.html
  22. 38
      Inventario/templates/tipo_articulo_update.html
  23. 51
      Inventario/templates/ventas.html
  24. 1
      Inventario/views.py
  25. 81
      Inventario/viewspdf.py
  26. 4
      TiendAlfa/urls.py

@ -4,114 +4,82 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tienda Dany</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar bg-dark navbar-dark">
<div class="container-fluid ">
<a class="navbar-brand " href="/">Tienda Dany</a>
<button class="navbar-toggler " type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasResponsive" aria-controls="offcanvasResponsive" aria-label="Toggle navigation">
<div class="container-fluid">
<a class="navbar-brand" href="/">Tienda Dany</a>
<button class="navbar-toggler" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasResponsive" aria-controls="offcanvasResponsive" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="offcanvas offcanvas-end bg-dark navbar-dark" tabindex="-1" id="offcanvasResponsive" aria-labelledby="offcanvasResponsiveLabel">
<div class="offcanvas offcanvas-end bg-dark text-white" tabindex="-1" id="offcanvasResponsive" aria-labelledby="offcanvasResponsiveLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title"style="color:white;" id="offcanvasNavbarLabel">Bienvenido {{user.username}}</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#offcanvasResponsive" aria-label="Close"></button>
<h5 class="offcanvas-title" id="offcanvasResponsiveLabel">Bienvenido {{ user.username }}</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<ul class="navbar-nav justify-content-end flex-grow-1 pe-3">
<a style="color:white;"></a>
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="/">Home</a>
</li>
{% if user.is_authenticated %}
<li class="nav-item dropdown ">
<a class="nav-link dropdown-toggle " role="button" data-bs-toggle="dropdown" aria-expanded="false">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Gestores
</a>
<ul class="dropdown-menu dropdown-menu-dark">
<li>
<p class="nav-link disabled text-center" aria-disabled="true">Gestor de proveedores</p>
<hr class="dropdown-divider">
</li>
<li><span class="dropdown-header">Gestor de proveedores</span></li>
<li><a class="dropdown-item" href="{% url 'proveedor' %}">Lista de proveedores</a></li>
<li><a class="dropdown-item" href="{% url 'proveedor_registro' %}">Registro de proveedores</li>
<li>
<hr class="dropdown-divider">
<a class="nav-link disabled text-center" aria-disabled="true">Gestor de bodegas</a>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="{% url 'proveedor_registro' %}">Registro de proveedores</a></li>
<li><hr class="dropdown-divider"></li>
<li><span class="dropdown-header">Gestor de bodegas</span></li>
<li><a class="dropdown-item" href="{% url 'bodega_vista' %}">Lista de Bodegas</a></li>
<li><a class="dropdown-item" href="{% url 'bodega_registro' %}">Registro de bodegas</li>
<li>
<hr class="dropdown-divider">
<a class="nav-link disabled text-center" aria-disabled="true">Gestor de tipos de articulo</a>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="{% url 'tipo_vista' %}">Lista de tipos de articulos</a></li>
<li><a class="dropdown-item" href="{% url 'tipo_registro' %}">Registro de tipos de articulos</li>
<li><a class="dropdown-item" href="{% url 'bodega_registro' %}">Registro de bodegas</a></li>
<li><hr class="dropdown-divider"></li>
<li><span class="dropdown-header">Gestor de tipos de articulo</span></li>
<li><a class="dropdown-item" href="{% url 'tipo_vista' %}">Lista de tipos de artículos</a></li>
<li><a class="dropdown-item" href="{% url 'tipo_registro' %}">Registro de tipos de artículos</a></li>
</ul>
</li>
<li>
<hr class="dropdown-divider">
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'articulo_vista' %}">Articulos</a>
</li>
<li>
<hr class="dropdown-divider">
<a class="nav-link" href="{% url 'articulo_vista' %}">Artículos</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'inventario_vista' %}">inventario</a>
</li>
<li>
<hr class="dropdown-divider">
<a class="nav-link" href="{% url 'inventario_vista' %}">Inventario</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'vista_inventario_mov' %}">movimiento de inventario</a>
</li>
<li>
<hr class="dropdown-divider">
<a class="nav-link" href="{% url 'vista_inventario_mov' %}">Movimiento de inventario</a>
</li>
<li class="nav-item dropdown ">
<a class="nav-link dropdown-toggle " role="button" data-bs-toggle="dropdown" aria-expanded="false">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Ventas
</a>
<ul class="dropdown-menu dropdown-menu-dark">
<li><a class="dropdown-item" href="{% url 'lista_ventas' %}">Lista de ventas</a></li>
<li><a class="dropdown-item" href="{% url 'nueva_venta' %}">Nueva venta</li>
<li><a class="dropdown-item" href="{% url 'nueva_venta' %}">Nueva venta</a></li>
</ul>
</li>
<li>
<hr class="dropdown-divider">
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'logout' %}">logout</a>
</li>
<li>
<hr class="dropdown-divider">
<a class="nav-link" href="{% url 'logout' %}">Logout</a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="{% url 'signin' %}">login</a>
<a class="nav-link" href="{% url 'signin' %}">Login</a>
</li>
{% endif %}
</ul>
</div>
</div>
</div>
</nav>
{% block content %}
{% endblock %}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
{% block content %}
{% endblock %}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

@ -2,25 +2,22 @@
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-8 offset-md-2 mt-4">
<form action="/articulo/crear/" method="POST">
<div class="card">
<div class="card-header text-bg-secondary">
<h4 class="text-center">Registrar nuevo articulo</h4>
</div>
<div class="card-body">
{% csrf_token %}
{{form.as_p}}
</div>
<div class="card-footer">
<div class="gap-3 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-danger" href="{% url 'articulo_vista' %}">Cancelar</a>
<button class="btn btn-primary ">Crear nuevo articulo</button>
</div>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-6 col-md-8 col-sm-12">
<form action="/articulo/crear/" method="POST" class="shadow-lg p-4 bg-light rounded">
{% csrf_token %}
<h3 class="text-center text-secondary mb-4">Registrar Nuevo Artículo</h3>
<div class="mb-3">
{{ form.as_p }}
</div>
<div class="d-flex justify-content-between align-items-center mt-4">
<a href="{% url 'articulo_vista' %}" class="btn btn-outline-danger">
<i class="bi bi-x-circle"></i> Cancelar
</a>
<button type="submit" class="btn btn-primary">
<i class="bi bi-save"></i> Crear Nuevo Artículo
</button>
</div>
</form>
</div>
@ -28,9 +25,10 @@
</main>
<script>
// Validación para permitir solo números en campos específicos
function permitirSoloNumeros(input) {
input.value = input.value.replace(/[^0-9]/g, '');
}
</script>
{% endblock %}
{% endblock %}

@ -1,56 +1,60 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner">
<main class="container my-5">
<div class="row">
<div class="col-md-10 offset-md-1 mt-4">
<form action="/articulo/" method="POST">
<div class="card-header row col-12 justify-content-end mb-2 pr-0 mt-2">
<h3 class="text-center">Tabla de articulos</h3>
</div>
<div class="col-md-10 offset-md-1">
<div class="card shadow-lg border-0 text-white">
<div class="card-header text-center bg-secondary text-white">
<h3 class="mb-0">Gestión de Artículos</h3>
</div>
<div class="card-body p-4">
<div class="table-responsive">
<table class="table mt-3">
<thead class="table-dark">
<table class="table table-bordered table-hover align-middle text-white">
<thead class="bg-dark text-secondary text-center">
<tr>
<th scope="col">#</th>
<th scope="col">Nombre del articulo</th>
<th scope="col">Medida del articulo</th>
<th scope="col">Descripcion</th>
<th scope="col">Tipo del articulo</th>
<th scope="col">Nombre</th>
<th scope="col">Medida</th>
<th scope="col">Descripción</th>
<th scope="col">Tipo</th>
<th scope="col">Proveedor</th>
<th scope="col">Precio de compra</th>
<th scope="col">Precio de venta</th>
<th scope="col">ACTUALIZAR</th>
<th scope="col">Precio Compra</th>
<th scope="col">Precio Venta</th>
<th scope="col">Acción</th>
</tr>
</thead>
<tbody>
{% for articulo in persona %}
<tr>
<th scope="row">{{ articulo.id }}</th>
<td> {{ articulo.nombre_articulo }} </td>
<td> {{ articulo.medida }} </td>
<td> {{ articulo.descripcion }} </td>
<td> {{ articulo.tipo_articulo.tipo_articulo }} </td>
<td> {{ articulo.proveedor.nombre_proveedor }} </td>
<td> {{ articulo.precio_compra }} </td>
<td> {{ articulo.precio_venta }} </td>
<td class="text-center"> <a class="btn btn-secondary" href="{% url 'articulo_update' articulo.id %}">&#128221;</a> </td>
</tr>
{% endfor %}
</tbody>
</table>
{% for articulo in persona %}
<tr class="text-center">
<td>{{ articulo.id }}</td>
<td>{{ articulo.nombre_articulo }}</td>
<td>{{ articulo.medida }}</td>
<td>{{ articulo.descripcion }}</td>
<td>{{ articulo.tipo_articulo.tipo_articulo }}</td>
<td>{{ articulo.proveedor.nombre_proveedor }}</td>
<td>${{ articulo.precio_compra|floatformat:2 }}</td>
<td>${{ articulo.precio_venta|floatformat:2 }}</td>
<td>
<a class="btn btn-sm btn-dark text-white" href="{% url 'articulo_update' articulo.id %}">
<i class="bi bi-pencil"></i> Editar
</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="9" class="text-center text-muted">No hay artículos registrados.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</form>
</div>
</div>
<div class="fixed-bottom col-12 mc-3">
<di class="gap-2 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-success rounded-pill btn-lg" href="{% url 'articulo_registro' %}" >&#128190;</a>
<br>
<br>
</div>
</div>
</div>
<a href="{% url 'bodega_registro' %}" class="btn btn-success btn-lg rounded-circle position-fixed bottom-0 end-0 m-3 shadow-lg">
<i class="fas fa-plus"></i>
</a>
</main>
{% endblock %}
{% endblock %}

@ -1,30 +1,27 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-8 offset-md-2 mt-4">
<form method="POST">
<div class="card">
<div class="card-header text-bg-secondary">
<h4 class="text-center">Actualizar Articulo</h4>
</div>
<div class="card-body">
{% csrf_token %}
{{form.as_p}}
</div>
<div class="card-footer">
<div class="gap-3 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-danger" href="{% url 'articulo_vista' %}">Cancelar</a>
<button class="btn btn-primary ">Actualizar articulo</button>
</div>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-6 col-md-8 col-sm-12">
<form method="POST" class="shadow-lg p-4 bg-light rounded">
{% csrf_token %}
<h3 class="text-center text-secondary mb-4">Actualizar Artículo</h3>
<div class="mb-3">
{{ form.as_p }}
</div>
<div class="d-flex justify-content-between align-items-center mt-4">
<a href="{% url 'articulo_vista' %}" class="btn btn-outline-danger">
<i class="bi bi-x-circle"></i> Cancelar
</a>
<button type="submit" class="btn btn-primary">
<i class="bi bi-save"></i> Actualizar Artículo
</button>
</div>
</form>
</div>
</div>
</main>
{% endblock %}
{% endblock %}

@ -2,24 +2,22 @@
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-8 offset-md-2 mt-4">
<form action="/bodega/crearbodega/" method="POST">
<div class="card">
<div class="card-header text-bg-secondary">
<h4 class="text-center">Registrar nueva bodega</h4>
</div>
<div class="card-body">
{% csrf_token %}
{{form}}
</div>
<div class="card-footer">
<div class="gap-3 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-danger" href="{% url 'bodega_vista' %}">Cancelar</a>
<button class="btn btn-primary ">Crear nueva bodega</button>
</div>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-6 col-md-8 col-sm-12">
<form action="/bodega/crearbodega/" method="POST" class="shadow-lg p-4 bg-light rounded">
{% csrf_token %}
<h3 class="text-center text-secondary mb-4">Registrar nueva bodega</h3>
<div class="mb-3">
{{ form }}
</div>
<div class="d-flex justify-content-between align-items-center mt-4">
<a href="{% url 'bodega_vista' %}" class="btn btn-outline-danger">
<i class="bi bi-x-circle"></i> Cancelar
</a>
<button type="submit" class="btn btn-primary">
<i class="bi bi-save"></i> Crear nueva bodega
</button>
</div>
</form>
</div>
@ -31,6 +29,5 @@
input.value = input.value.replace(/[^0-9]/g, '');
}
</script>
{% endblock %}
{% endblock %}

@ -1,54 +1,61 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-10 offset-md-1 mt-4">
<form action="/bodega/" method="POST">
<div class="card-header row col-12 justify-content-end mb-2 pr-0 mt-2">
<h3 class="text-center">Tabla de Bodega</h3>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-md-10">
<div class="card shadow-lg border-0">
<div class="card-header text-center bg-secondary text-white">
<h3 class="mb-0">Tabla de Bodega</h3>
</div>
<div class="card-body p-4">
<div class="table-responsive">
<table class="table mt-3">
<thead class="table-dark">
<table class="table table-bordered table-hover align-middle text-white">
<thead class="bg-dark text-secondary text-center">
<tr>
<th scope="col">#</th>
<th scope="col">Codigo de la bodega</th>
<th scope="col">Nombre la bodega</th>
<th scope="col">Código de la Bodega</th>
<th scope="col">Nombre de la Bodega</th>
<th scope="col">Estado</th>
<th scope="col">Direccion</th>
<th scope="col">ACTUALIZAR</th>
<th scope="col">Dirección</th>
<th scope="col">Actualizar</th>
</tr>
</thead>
<tbody>
{% for bodega in persona %}
<tr>
<th scope="row"> {{bodega.id}} </th>
<td> {{bodega.codigo_bodega}} </td>
<td> {{bodega.nombre_bodega}} </td>
{% if bodega.estado %}
<td> activo </td>
{% else %}
<td> inactivo </td>
{% endif %}
<td> {{bodega.direccion_bodega}} </td>
<td class="text-center"> <a class="btn btn-secondary" href="{% url 'bodega_update' bodega.id %}">&#128221;</a> </td>
</tr>
{% endfor %}
</tbody>
</table>
{% for bodega in persona %}
<tr class="text-center">
<td>{{ bodega.id }}</td>
<td>{{ bodega.codigo_bodega }}</td>
<td>{{ bodega.nombre_bodega }}</td>
<td>
{% if bodega.estado %}
Activo
{% else %}
Inactivo
{% endif %}
</td>
<td>{{ bodega.direccion_bodega }}</td>
<td>
<a class="btn btn-sm btn-dark text-white " href="{% url 'bodega_update' bodega.id %}">
<i class="bi bi-pencil">Editar</i>
</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="6" class="text-center text-muted">No hay bodegas registradas.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</form>
</div>
</div>
<div class="fixed-bottom col-12 mc-3">
<di class="gap-2 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-success rounded-pill btn-lg" href="{% url 'bodega_registro' %}" >&#128190;</a>
<br>
<br>
</div>
</div>
</div>
<a href="{% url 'bodega_registro' %}" class="btn btn-success btn-lg rounded-circle position-fixed bottom-0 end-0 m-3 shadow-lg">
<i class="fas fa-plus"></i>
</a>
</main>
{% endblock %}
{% endblock %}

@ -1,28 +1,26 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-8 offset-md-2 mt-4">
<form method="POST">
<div class="card">
<div class="card-header text-bg-secondary">
<h4 class="text-center">Actualizar Bodega</h4>
</div>
<div class="card-body">
{% csrf_token %}
{{form}}
</div>
<div class="card-footer">
<div class="gap-3 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-danger" href="{% url 'bodega_vista' %}">Cancelar</a>
<button class="btn btn-primary ">Actualizar bodega</button>
</div>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-6 col-md-8 col-sm-12">
<form method="POST" class="shadow-lg p-4 bg-light rounded">
{% csrf_token %}
<h3 class="text-center text-secondary mb-4">Actualizar Bodega</h3>
<div class="mb-3">
{{ form }}
</div>
<div class="d-flex justify-content-between align-items-center mt-4">
<a href="{% url 'bodega_vista' %}" class="btn btn-outline-danger">
<i class="bi bi-x-circle"></i> Cancelar
</a>
<button type="submit" class="btn btn-primary">
<i class="bi bi-save"></i> Actualizar bodega
</button>
</div>
</form>
</div>
</div>
</main>
{% endblock %}
{% endblock %}

@ -1,36 +1,94 @@
<!DOCTYPE html>
<html>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gráfico Interactivo</title>
<!-- Agregar Bootstrap -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Agregar Chart.js -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<style>
/* Ajustes adicionales para hacer el gráfico más grande en pantallas grandes */
.container {
max-width: 900px;
margin-top: 50px;
}
h1 {
text-align: center;
margin-bottom: 20px;
color: #333;
}
.btn-secondary {
margin-top: 20px;
}
</style>
</head>
<body>
<h1>Gráfico de cantidad de productos</h1>
<canvas id="grafico" width="400" height="200"></canvas>
<div class="container">
<h1>Gráfico de Cantidad de Productos</h1>
<!-- Canvas para el gráfico -->
<canvas id="grafico"></canvas>
<!-- Botón para volver -->
<a href="{% url 'inventario_vista' %}" class="btn btn-secondary btn-lg d-block mx-auto">Volver</a>
</div>
<script>
const ctx = document.getElementById('grafico').getContext('2d');
// Preparar los labels con el nombre del producto y la medida
const productosConMedida = {{ productos|safe }}.map((producto, index) => {
// Asumir que la medida está disponible en el mismo índice que el producto en la lista
const medida = {{ medidas|safe }}[index]; // Asegúrate de pasar las medidas correctamente desde el backend
return producto + ' (' + medida + ')'; // Combina nombre y medida
});
const myChart = new Chart(ctx, {
type: 'bar',
type: 'pie', // Tipo de gráfico de pastel
data: {
labels: {{ productos|safe }}, // Nombres de los productos
labels: productosConMedida, // Nombres de los productos con medida
datasets: [{
label: 'Cantidad de Productos',
data: {{ cantidades|safe }}, // Cantidades de productos
backgroundColor: 'rgba(75, 192, 192, 0.2)',
borderColor: 'rgba(75, 192, 192, 1)',
backgroundColor: [
'rgba(75, 192, 192, 0.6)',
'rgba(153, 102, 255, 0.6)',
'rgba(255, 159, 64, 0.6)',
'rgba(54, 162, 235, 0.6)',
'rgba(255, 99, 132, 0.6)',
'rgba(255, 205, 86, 0.6)',
'rgba(201, 203, 207, 0.6)'
], // Colores para cada sección del gráfico
borderColor: 'rgba(255, 255, 255, 0.7)', // Color del borde
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
responsive: true,
plugins: {
legend: {
position: 'top',
},
tooltip: {
callbacks: {
label: function(tooltipItem) {
return tooltipItem.label + ': ' + tooltipItem.raw + ' productos';
}
}
}
}
}
});
</script>
<a href="{% url 'inventario_vista' %}" class="btn btn-secondary">volver</a>
<!-- Agregar Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

@ -166,6 +166,10 @@
});
</script>
{% else %}
<script>
window.location.href = "{% url 'signin' %}";
</script>
{% endif %}
{% endblock %}

@ -2,27 +2,22 @@
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-8 offset-md-2 mt-4">
<form action="/inventariomov/crear/" method="POST">
<div class="card">
<div class="card-header text-bg-secondary">
<h3 class="text-center">Registrar nuevo movimiento de inventario</h3>
</div>
<div class="card-body">
<br>
{% csrf_token %}
{{form.as_p}}
</div>
<div class="card-footer">
<div class="gap-3 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-danger" href="{% url 'vista_inventario_mov' %}">Cancelar</a>
<button class="btn btn-primary ">Crear nuevo movimiento de inventario</button>
</div>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-6 col-md-8 col-sm-12">
<form action="/inventariomov/crear/" method="POST" class="shadow-lg p-4 bg-light rounded">
{% csrf_token %}
<h3 class="text-center text-secondary mb-4">Registrar nuevo movimiento de inventario</h3>
<div class="mb-3">
{{ form.as_p }}
</div>
<div class="d-flex justify-content-between align-items-center mt-4">
<a href="{% url 'vista_inventario_mov' %}" class="btn btn-outline-danger">
<i class="bi bi-x-circle"></i> Cancelar
</a>
<button type="submit" class="btn btn-primary">
<i class="bi bi-save"></i> Crear nuevo movimiento de inventario
</button>
</div>
</form>
</div>
@ -34,5 +29,5 @@
input.value = input.value.replace(/[^0-9]/g, '');
}
</script>
{% endblock %}
{% endblock %}

@ -1,57 +1,60 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-10 offset-md-1 mt-4">
<form action="/inventario/" method="POST">
<div class="card-header">
<h3 class="text-center">Inventario</h3>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-md-10">
<div class="card shadow-lg border-0">
<div class="card-header text-center bg-secondary text-white">
<h3 class="mb-0">Inventario</h3>
</div>
<div class="card-body p-4">
<div class="table-responsive">
<table class="table mt-3">
<thead class="table-dark">
<table class="table table-bordered table-hover align-middle text-white">
<thead class="bg-dark text-secondary text-center">
<tr>
<th scope="col">#</th>
<th scope="col">Articulo</th>
<th scope="col">Descripcion de articulo</th>
<th scope="col">Artículo</th>
<th scope="col">Descripción de Artículo</th>
<th scope="col">Bodega</th>
<th scope="col">Cantidad</th>
</tr>
</thead>
<tbody>
{% for inventario in persona %}
<tr>
<th scope="row">{{ inventario.id }}</th>
<td> {{ inventario.articulo.nombre_articulo }} {{inventario.articulo.medida}} </td>
<td> {{ inventario.articulo.descripcion }} </td>
<td> {{ inventario.bodega.nombre_bodega }} </td>
<td> {{ inventario.cantidad }} </td>
</tr>
{% endfor %}
</tbody>
</table>
{% for inventario in persona %}
<tr class="text-center">
<td>{{ inventario.id }}</td>
<td>{{ inventario.articulo.nombre_articulo }} {{ inventario.articulo.medida }}</td>
<td>{{ inventario.articulo.descripcion }}</td>
<td>{{ inventario.bodega.nombre_bodega }}</td>
<td>{{ inventario.cantidad }}</td>
</tr>
{% empty %}
<tr>
<td colspan="5" class="text-center text-muted">No hay inventarios registrados.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="fixed-bottom col-12 mc-3">
<di class="gap-2 d-md-flex justify-content-md-end mb-3">
<div class="btn-group dropup">
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
&#128194;
</button>
<ul class="dropdown-menu dropdown-menu-dark">
<!-- Dropdown menu links -->
<li><a class="dropdown-item" href="{% url 'generar_reporte_pdf' %}" >Descargar PDF</a></li>
<li><a class="dropdown-item" href="{% url 'generar_reporte_excel' %}" >Descargar Excel</a></li>
<li><a class="dropdown-item" href="{% url 'generar_reporte_csv' %}">Descargar CSV</a></li>
<li><a class="dropdown-item" href="{% url 'generar_grafico_chartjs' %}">Generar Grafico</a></li>
</ul>
</div>
<br>
<div class="fixed-bottom d-flex justify-content-end p-3">
<div class="btn-group dropup">
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
&#128194;
</button>
<ul class="dropdown-menu dropdown-menu-dark">
<li><a class="dropdown-item" href="{% url 'generar_reporte_pdf' %}">Descargar PDF</a></li>
<li><a class="dropdown-item" href="{% url 'generar_reporte_excel' %}">Descargar Excel</a></li>
<li><a class="dropdown-item" href="{% url 'generar_reporte_csv' %}">Descargar CSV</a></li>
<li><a class="dropdown-item" href="{% url 'generar_grafico_chartjs' %}">Generar Gráfico</a></li>
</ul>
</div>
</div>
</main>
{% endblock %}
{% endblock %}

@ -1,47 +1,60 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-10 offset-md-1 mt-4">
<form action="/inventariomov/" method="POST">
<div class="card-header row col-12 justify-content-end mb-2 pr-0 mt-2">
<h3 class="text-center">Tabla de movimientos de inventario</h3>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-md-10">
<div class="card shadow-lg border-0">
<div class="card-header text-center bg-secondary text-white">
<h3 class="mb-0">Movimientos de Inventario</h3>
</div>
<div class="card-body p-4">
<div class="table-responsive">
<table class="table mt-3">
<thead class="table-dark">
<table class="table table-bordered table-hover align-middle text-white">
<thead class="bg-dark text-secondary text-center">
<tr>
<th scope="col">#</th>
<th scope="col">Bodega</th>
<th scope="col">Articulo</th>
<th scope="col">Artículo</th>
<th scope="col">Cantidad</th>
<th scope="col">Tipo de movimiento</th>
<th scope="col">Tipo de Movimiento</th>
</tr>
</thead>
<tbody>
{% for movimiento_inventario in persona %}
<tr>
<th scope="row">{{ movimiento_inventario.id }}</th>
<td> {{ movimiento_inventario.articulo.nombre_articulo }} {{movimiento_inventario.articulo.medida}} </td>
<td> {{ movimiento_inventario.bodega.nombre_bodega }} </td>
<td> {{ movimiento_inventario.cantidad }} </td>
<td> {{ movimiento_inventario.tipo_inventario }} </td>
</tr>
{% endfor %}
</tbody>
</table>
{% for movimiento_inventario in persona %}
<tr class="text-center">
<td>{{ movimiento_inventario.id }}</td>
<td>{{ movimiento_inventario.articulo.nombre_articulo }} {{ movimiento_inventario.articulo.medida }}</td>
<td>{{ movimiento_inventario.bodega.nombre_bodega }}</td>
<td>{{ movimiento_inventario.cantidad }}</td>
<td>{{ movimiento_inventario.tipo_inventario }}</td>
</tr>
{% empty %}
<tr>
<td colspan="5" class="text-center text-muted">No hay movimientos registrados.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="fixed-bottom col-12 mc-3">
<di class="gap-2 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-success rounded-pill btn-lg" href="{% url 'registrar_movimiento' %}" >&#128190;</a>
<br>
<br>
<div class="fixed-bottom d-flex justify-content-end p-3">
<div class="btn-group dropup">
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
&#128194;
</button>
<ul class="dropdown-menu dropdown-menu-dark">
<li><a class="dropdown-item" href="{% url 'reporte_pdf' %}">Descargar PDF</a></li>
<li><a class="dropdown-item" href="{% url 'reporte_excel' %}">Descargar Excel</a></li>
<li><a class="dropdown-item" href="{% url 'reporte_csv' %}">Descargar CSV</a></li>
<li><a class="dropdown-item" href="{% url 'registrar_movimiento' %}">Agregar nuevo movimiento</a></li>
</ul>
</div>
</div>
</main>
{% endblock %}
{% endblock %}

@ -2,25 +2,22 @@
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-8 offset-md-2 mt-4">
<form action="/ventas/nueva_venta/" method="POST">
<div class="card">
<div class="card-header text-bg-secondary">
<h4 class="text-center">Registrar nueva venta</h4>
</div>
<div class="card-body">
{% csrf_token %}
{{form.as_p}}
</div>
<div class="card-footer">
<div class="gap-3 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-danger" href="{% url 'lista_ventas' %}">Cancelar</a>
<button class="btn btn-primary ">Nueva venta</button>
</div>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-6 col-md-8 col-sm-12">
<form action="/ventas/nueva_venta/" method="POST" class="shadow-lg p-4 bg-light rounded">
{% csrf_token %}
<h3 class="text-center text-secondary mb-4">Registrar nueva venta</h3>
<div class="mb-3">
{{ form.as_p }}
</div>
<div class="d-flex justify-content-between align-items-center mt-4">
<a href="{% url 'lista_ventas' %}" class="btn btn-outline-danger">
<i class="bi bi-x-circle"></i> Cancelar
</a>
<button type="submit" class="btn btn-primary">
<i class="bi bi-save"></i> Nueva venta
</button>
</div>
</form>
</div>

@ -1,36 +1,172 @@
<!DOCTYPE html>
<html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Reporte de Inventario</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<style>
body { font-family: Arial, sans-serif; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #000; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
/* Estilos generales */
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f4f6f9;
margin: 0;
padding: 0;
}
h1 {
text-align: center;
color: #333;
margin-top: 20px;
font-size: 2rem; /* Letra más grande */
}
/* Contenedor principal */
.container {
width: 80%;
margin: 0 auto;
background-color: #fff;
padding: 20px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
border-radius: 8px;
}
/* Estilo para el gráfico */
#grafico {
max-width: 600px;
margin: 20px auto;
height: 400px; /* Ajusta el tamaño del gráfico */
}
/* Estilos de la tabla */
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th, td {
border: 1px solid #ddd;
padding: 10px 15px; /* Celdas más pequeñas */
text-align: left;
font-size: 1.2rem; /* Letras un poco más grandes */
}
th {
background-color: #0066cc; /* Color azul */
color: white;
font-weight: bold;
}
td {
background-color: #f9f9f9;
}
tr:nth-child(even) td {
background-color: #f1f1f1;
}
tr:hover td {
background-color: #ddd;
}
/* Estilo de los bordes */
table, th, td {
border-radius: 5px;
border: 1px solid #e0e0e0;
}
/* Estilos para la paginación y detalles si se desean agregar */
.pagination {
margin-top: 20px;
text-align: center;
}
.pagination a {
margin: 0 5px;
text-decoration: none;
padding: 10px 15px;
background-color: #0066cc; /* Color azul */
color: white;
border-radius: 4px;
}
.pagination a:hover {
background-color: #005bb5; /* Tono más oscuro de azul */
}
</style>
</head>
<body>
<h1>Reporte de Inventario</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>Bodega</th>
<th>Artículo</th>
<th>Cantidad</th>
<th>Precio</th>
</tr>
</thead>
<tbody>
{% for item in inventarios %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.bodega.nombre_bodega }}</td>
<td>{{ item.articulo.nombre_articulo }}</td>
<td>{{ item.cantidad }}</td>
<td>{{ item.precio }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="container">
<h1>Reporte de Inventario</h1>
<!-- Canvas para el gráfico de pastel -->
<canvas id="grafico"></canvas>
<table>
<thead>
<tr>
<th>ID</th>
<th>Bodega</th>
<th>Artículo</th>
<th>Cantidad</th>
</tr>
</thead>
<tbody>
{% for item in inventarios %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.bodega.nombre_bodega }}</td>
<td>{{ item.articulo.nombre_articulo }}</td>
<td>{{ item.cantidad }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<script>
const ctx = document.getElementById('grafico').getContext('2d');
const productos = {{ productos|safe }};
const cantidades = {{ cantidades|safe }};
const medidas = {{ medidas|safe }}.map((medida, index) => productos[index] + ' (' + medida + ')');
const myChart = new Chart(ctx, {
type: 'pie', // Tipo de gráfico de pastel
data: {
labels: medidas, // Nombres de los productos con medida
datasets: [{
label: 'Cantidad de Productos',
data: cantidades, // Cantidades de productos
backgroundColor: [
'rgba(75, 192, 192, 0.6)',
'rgba(153, 102, 255, 0.6)',
'rgba(255, 159, 64, 0.6)',
'rgba(54, 162, 235, 0.6)',
'rgba(255, 99, 132, 0.6)',
'rgba(255, 205, 86, 0.6)',
'rgba(201, 203, 207, 0.6)'
], // Colores para cada sección del gráfico
borderColor: 'rgba(255, 255, 255, 0.7)', // Color del borde
borderWidth: 1
}]
},
options: {
responsive: true,
plugins: {
legend: {
position: 'top',
},
tooltip: {
callbacks: {
label: function(tooltipItem) {
return tooltipItem.label + ': ' + tooltipItem.raw + ' productos';
}
}
}
}
}
});
</script>
</body>
</html>

@ -1,32 +1,29 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-8 offset-md-2 mt-4">
<form action="/proveedor/crear/" method="POST">
<div class="card">
<div class="card-header text-bg-secondary ">
<h4 class="text-center">Registrar Nuevo Proveedor</h4>
</div>
<div class="card-body">
{% csrf_token %}
{{form}}
</div>
<div class="card-footer">
<div class="gap-3 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-danger" href="{% url 'proveedor' %}">Cancelar</a>
<button class="btn btn-primary ">Crear nuevo proveedor</button>
</div>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-6 col-md-8 col-sm-12">
<form action="/proveedor/crear/" method="POST" class="shadow-lg p-4 bg-light rounded">
{% csrf_token %}
<h3 class="text-center text-secondary mb-4">Registrar Nuevo Proveedor</h3>
<div class="mb-3">
{{ form }}
</div>
<div class="d-flex justify-content-between align-items-center mt-4">
<a href="{% url 'proveedor' %}" class="btn btn-outline-danger">
<i class="bi bi-x-circle"></i> Cancelar
</a>
<button type="submit" class="btn btn-primary">
<i class="bi bi-save"></i> Crear nuevo proveedor
</button>
</div>
</form>
</div>
</div>
</main>
<script>
function formatearInput(input) {
// Remover caracteres no numéricos
@ -38,4 +35,5 @@ function formatearInput(input) {
input.value = valor;
}
</script>
{% endblock %}
{% endblock %}

@ -1,53 +1,55 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner-lg">
<div class="row">
<div class="col-md-10 offset-md-1 mt-4">
<form action="/proveedor/" method="POST">
<div class="card-header justify-content-md-center mb-3">
<h3 class="text-center">Tabla de proveedores</h3>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-md-10">
<div class="card shadow-lg border-0">
<div class="card-header text-center bg-secondary text-white">
<h3 class="mb-0">Tabla de Proveedores</h3>
</div>
<div class="card-body p-4">
<div class="table-responsive">
<table class="table mt-3">
<thead class="table-dark">
<table class="table table-bordered table-hover align-middle text-white">
<thead class="bg-dark text-secondary text-center">
<tr>
<th scope="col">#</th>
<th scope="col">Nombre</th>
<th scope="col">Email</th>
<th scope="col">Telefono</th>
<th scope="col">Direccion</th>
<th scope="col">ACTUALIZAR</th>
<th scope="col">Teléfono</th>
<th scope="col">Dirección</th>
<th scope="col">Actualizar</th>
</tr>
</thead>
<tbody>
{% for proveedor in persona %}
<tr>
<th scope="row"> {{proveedor.id}} </th>
<td> {{proveedor.nombre_proveedor}} </td>
<td> {{proveedor.email}} </td>
<td> {{proveedor.telefono}} </td>
<td> {{proveedor.direccion}} </td>
<td class="text-center"> <a class="btn btn-secondary rounded-pill btn-lg" href="{% url 'Proveedor_update' proveedor.id %}">&#128221;</a> </td>
</tr>
{% endfor %}
</tbody>
</table>
{% for proveedor in persona %}
<tr class="text-center">
<td>{{ proveedor.id }}</td>
<td>{{ proveedor.nombre_proveedor }}</td>
<td>{{ proveedor.email }}</td>
<td>{{ proveedor.telefono }}</td>
<td>{{ proveedor.direccion }}</td>
<td>
<a class="btn btn-secondary rounded-pill btn-lg" href="{% url 'Proveedor_update' proveedor.id %}">
&#128221;
</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="6" class="text-center text-muted">No hay proveedores registrados.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</form>
</div>
</div>
<div class="fixed-bottom col-12 mc-3">
<di class="gap-2 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-success rounded-pill btn-lg" href="{% url 'proveedor_registro' %}" >&#128190;</a>
<br>
<br>
</div>
</div>
</div>
<a href="{% url 'proveedor_registro' %}" class="btn btn-success btn-lg rounded-circle position-fixed bottom-0 end-0 m-3 shadow-lg">
<i class="fas fa-plus"></i>
</a>
</main>
{% endblock %}
{% endblock %}

@ -1,29 +1,27 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-8 offset-md-2 mt-4">
<form method="POST">
<div class="card">
<div class="card-header text-bg-secondary">
<h4 class="text-center">Actualizar proveedor</h4>
</div>
<div class="card-body">
{% csrf_token %}
{{form}}
</div>
<div class="card-footer">
<div class="gap-3 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-danger" href="{% url 'proveedor' %}">Cancelar</a>
<button class="btn btn-primary ">Actualizar proveedor</button>
</div>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-6 col-md-8 col-sm-12">
<form method="POST" class="shadow-lg p-4 bg-light rounded">
{% csrf_token %}
<h3 class="text-center text-secondary mb-4">Actualizar Proveedor</h3>
<div class="mb-3">
{{ form }}
</div>
<div class="d-flex justify-content-between align-items-center mt-4">
<a href="{% url 'proveedor' %}" class="btn btn-outline-danger">
<i class="bi bi-x-circle"></i> Cancelar
</a>
<button type="submit" class="btn btn-primary">
<i class="bi bi-save"></i> Actualizar proveedor
</button>
</div>
</form>
</div>
</div>
</main>
{% endblock %}
{% endblock %}

@ -0,0 +1,46 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Reporte de Inventario</title>
<style>
body { font-family: Arial, sans-serif; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #000; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
/* Estilo para la celda de Observaciones */
td.observaciones {
white-space: normal; /* Permitir el salto de línea */
word-wrap: break-word; /* Ajustar el texto largo dentro de la celda */
max-width: 300px; /* Limitar el ancho de la celda */
overflow-wrap: break-word; /* Hacer que las palabras largas se ajusten */
}
</style>
</head>
<body>
<h1>Reporte de Movimientos de Inventario</h1>
<table>
<thead>
<tr>
<th>Fecha</th>
<th>Tipo de Movimiento</th>
<th>Bodega</th>
<th>Artículo</th>
<th>Cantidad</th>
</tr>
</thead>
<tbody>
{% for movimiento in movimientos %}
<tr>
<td>{{ movimiento.fecha }}</td>
<td>{{ movimiento.tipo_inventario }}</td>
<td>{{ movimiento.bodega }}</td>
<td>{{ movimiento.articulo }}</td>
<td>{{ movimiento.cantidad }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>

@ -2,27 +2,32 @@
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-4 offset-md-4 mt-5">
<form action="/signin/" method="POST" class="card card-body">
<h1 class="text-center">Login</h1>
{% csrf_token %}
<div class="mb-3">
<label for="username"> Usuario:</label>
<input type="text" name="username" id="username"
class="form-control" placeholder="Escribe tu usuario">
</div>
<div class="mb-3">
<label for="password"> Contraseña:</label>
<input type="password" name="password" id="password"
class="form-control" placeholder="escribe tu contraseña">
</div>
<button class="btn btn-primary"> Signin </button>
</form>
<main class="container">
<div class="row justify-content-center">
<div class="col-md-6 col-lg-4 mt-5">
<div class="card shadow-lg border-0">
<div class="card-body p-4">
<h2 class="text-center mb-4">Iniciar Sesión</h2>
<form action="/signin/" method="POST">
{% csrf_token %}
<div class="mb-4">
<label for="username" class="form-label">Usuario:</label>
<input type="text" name="username" id="username" class="form-control" placeholder="Escribe tu usuario" required>
</div>
<div class="mb-4">
<label for="password" class="form-label">Contraseña:</label>
<input type="password" name="password" id="password" class="form-control" placeholder="Escribe tu contraseña" required>
</div>
<div class="d-grid gap-2">
<button class="btn btn-primary btn-lg" type="submit">Iniciar sesión</button>
</div>
</form>
</div>
</div>
</div>
</div>
</main>
{% endblock %}
{% endblock %}

@ -2,29 +2,26 @@
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-8 offset-md-2 mt-4">
<form action="/tipo/creartipo_articulo/" method="POST">
<div class="card">
<div class="card-header text-bg-secondary">
<h4 class="text-center">Registrar nuevo tipo de articulo</h4>
</div>
<div class="card-body">
{% csrf_token %}
{{form}}
</div>
<div class="card-footer">
<div class="gap-3 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-danger" href="{% url 'tipo_vista' %}">Cancelar</a>
<button class="btn btn-primary ">Crear nuevo tipo de articulo</button>
</div>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-6 col-md-8 col-sm-12">
<form action="/tipo/creartipo_articulo/" method="POST" class="shadow-lg p-4 bg-light rounded">
{% csrf_token %}
<h3 class="text-center text-secondary mb-4">Registrar nuevo tipo de artículo</h3>
<div class="mb-3">
{{ form }}
</div>
<div class="d-flex justify-content-between align-items-center mt-4">
<a href="{% url 'tipo_vista' %}" class="btn btn-outline-danger">
<i class="bi bi-x-circle"></i> Cancelar
</a>
<button type="submit" class="btn btn-primary">
<i class="bi bi-save"></i> Crear nuevo tipo de artículo
</button>
</div>
</form>
</div>
</div>
</main>
{% endblock %}
{% endblock %}

@ -1,44 +1,53 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-10 offset-md-1 mt-4">
<form action="/tipo/" method="POST">
<div class="card-header">
<h3 class="text-center">Tabla de tipos de articulos</h3>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-md-10">
<div class="card shadow-lg border-0">
<div class="card-header text-center bg-secondary text-white">
<h3 class="mb-0">Tabla de Tipos de Artículos</h3>
</div>
<div class="card-body p-4">
<div class="table-responsive">
<table class="table mt-3">
<thead class="table-dark">
<table class="table table-bordered table-hover align-middle text-white">
<thead class="bg-dark text-secondary text-center">
<tr>
<th scope="col">#</th>
<th scope="col">tipo de articulo</th>
<th scope="col">Descripcion</th>
<th scope="col">ACTUALIZAR</th>
<th scope="col">Tipo de Artículo</th>
<th scope="col">Descripción</th>
<th scope="col">Actualizar</th>
</tr>
</thead>
<tbody>
{% for tipo_articulo in persona %}
<tr>
<th scope="row"> {{tipo_articulo.id}} </th>
<td> {{tipo_articulo.tipo_articulo}} </td>
<td> {{tipo_articulo.descripcion}} </td>
<td class="text-center"> <a class="btn btn-secondary rounded-pill" href="{% url 'tipo_update' tipo_articulo.id %}">&#128221;</a> </td> </tr>
{% endfor %}
</tbody>
</table>
{% for tipo_articulo in persona %}
<tr class="text-center">
<td>{{ tipo_articulo.id }}</td>
<td>{{ tipo_articulo.tipo_articulo }}</td>
<td>{{ tipo_articulo.descripcion }}</td>
<td>
<a class="btn btn-secondary rounded-pill" href="{% url 'tipo_update' tipo_articulo.id %}">
&#128221;
</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="4" class="text-center text-muted">No hay tipos de artículos registrados.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</form>
</div>
</div>
<div class="fixed-bottom col-12 mc-3">
<di class="gap-2 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-success rounded-pill btn-lg" href="{% url 'tipo_registro' %}" >&#128190</a>
<br>
<br>
</div>
</div>
</div>
<!-- Botón flotante con icono de plus -->
<a href="{% url 'tipo_registro' %}" class="btn btn-success btn-lg rounded-circle position-fixed bottom-0 end-0 m-3 shadow-lg">
<i class="fas fa-plus"></i>
</a>
</main>
{% endblock %}
{% endblock %}

@ -1,29 +1,27 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-8 offset-md-2 mt-4">
<form method="POST">
<div class="card">
<div class="card-header text-bg-secondary">
<h4 class="text-center">Actualizar proveedor</h4>
</div>
<div class="card-body">
{% csrf_token %}
{{form}}
</div>
<div class="card-footer">
<div class="gap-3 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-danger" href="{% url 'tipo_vista' %}">Cancelar</a>
<button class="btn btn-primary ">Actualizar tipo de articulo</button>
</div>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-6 col-md-8 col-sm-12">
<form method="POST" class="shadow-lg p-4 bg-light rounded">
{% csrf_token %}
<h3 class="text-center text-secondary mb-4">Actualizar tipo de artículo</h3>
<div class="mb-3">
{{ form }}
</div>
<div class="d-flex justify-content-between align-items-center mt-4">
<a href="{% url 'tipo_vista' %}" class="btn btn-outline-danger">
<i class="bi bi-x-circle"></i> Cancelar
</a>
<button type="submit" class="btn btn-primary">
<i class="bi bi-save"></i> Actualizar tipo de artículo
</button>
</div>
</form>
</div>
</div>
</main>
{% endblock %}
{% endblock %}

@ -1,16 +1,17 @@
{% extends "Base.html" %}
{% block content %}
<main class="conteiner">
<div class="row">
<div class="col-md-10 offset-md-1 mt-4">
<form action="/ventas/" method="POST">
<div class="card-header">
<h3 class="text-center">Tabla de ventas</h3>
</div>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-md-10">
<div class="card shadow-lg border-0">
<div class="card-header text-center bg-secondary text-white">
<h3 class="mb-0">Tabla de Ventas</h3>
</div>
<div class="card-body p-4">
<div class="table-responsive">
<table class="table mt-3">
<thead class="table-dark">
<table class="table table-bordered table-hover align-middle text-white">
<thead class="bg-dark text-secondary text-center">
<tr>
<th scope="col">#</th>
<th scope="col">Fecha</th>
@ -24,8 +25,8 @@
</thead>
<tbody>
{% for venta in ventas %}
<tr>
<th scope="row"> {{venta.id}} </th>
<tr class="text-center">
<td>{{ venta.id }}</td>
<td>{{ venta.fecha }}</td>
<td>{{ venta.bodega }}</td>
<td>{{ venta.articulo.nombre_articulo }}</td>
@ -34,21 +35,23 @@
<td>${{ venta.total }}</td>
<td>{{ venta.observaciones }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% empty %}
<tr>
<td colspan="8" class="text-center text-muted">No hay ventas registradas.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</form>
</div>
</div>
<div class="fixed-bottom col-12 mc-3">
<di class="gap-2 d-md-flex justify-content-md-end mb-3">
<a class="btn btn-success rounded-pill btn-lg" href="{% url 'nueva_venta' %}" >&#128190;</a>
<br>
<br>
</div>
</div>
</div>
<!-- Botón flotante con icono de plus -->
<a href="{% url 'nueva_venta' %}" class="btn btn-success btn-lg rounded-circle position-fixed bottom-0 end-0 m-3 shadow-lg">
<i class="fas fa-plus"></i>
</a>
</main>
{% endblock %}
{% endblock %}

@ -73,6 +73,7 @@ def graficos_view(request):
}
return render(request, "index.html", context)
def signin(request):
if request.method == 'GET':
return render ( request, 'signin.html',{

@ -2,10 +2,10 @@ from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
import openpyxl
import csv
from django.template.loader import get_template
from django.template.loader import get_template, render_to_string
from xhtml2pdf import pisa
from django.shortcuts import render
from .models import inventario
from .models import inventario, movimiento_inventario
@login_required
def generar_reporte_pdf(request):
@ -39,12 +39,12 @@ def generar_reporte_excel(request):
ws.title = 'Reporte de Inventario'
# Encabezados
headers = ['ID', 'Bodega', 'Artículo', 'Cantidad', 'Precio']
headers = ['ID', 'Bodega', 'Artículo', 'Cantidad']
ws.append(headers)
# Datos del inventario
for item in inventario.objects.all():
ws.append([item.id, item.bodega.nombre_bodega, item.articulo.nombre_articulo, item.cantidad, item.precio])
ws.append([item.id, item.bodega.nombre_bodega, item.articulo.nombre_articulo, item.cantidad])
# Configurar la respuesta HTTP
response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
@ -63,21 +63,88 @@ def generar_reporte_csv(request):
writer = csv.writer(response)
# Encabezados
writer.writerow(['ID', 'Bodega', 'Artículo', 'Cantidad', 'Precio'])
writer.writerow(['ID', 'Bodega', 'Artículo', 'Cantidad'])
# Datos del inventario
for item in inventario.objects.all():
writer.writerow([item.id, item.bodega.nombre_bodega, item.articulo.nombre_articulo, item.cantidad, item.precio])
writer.writerow([item.id, item.bodega.nombre_bodega, item.articulo.nombre_articulo, item.cantidad])
return response
@login_required
def generar_grafico_chartjs(request):
# Obtener todos los inventarios
inventarios = inventario.objects.all()
# Extraer los productos, cantidades y medidas (suponiendo que cada producto tiene una medida asociada)
productos = [item.articulo.nombre_articulo for item in inventarios]
cantidades = [item.cantidad for item in inventarios]
medidas = [item.articulo.medida for item in inventarios] # Asumiendo que cada 'articulo' tiene un atributo 'medida'
# Pasar los datos a la plantilla
return render(request, 'grafico_chartjs.html', {
'productos': productos,
'cantidades': cantidades,
})
'medidas': medidas, # Pasar las medidas también
})
def reporte_excel(request):
# Obtener todos los movimientos de inventario
movimientos = movimiento_inventario.objects.all()
# Crear la respuesta de archivo Excel
response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename="reporte_inventario.xlsx"'
# Crear el libro de Excel
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Movimientos de Inventario"
# Crear encabezados de columnas
ws.append(['Fecha', 'Tipo de Movimiento', 'Bodega', 'Artículo', 'Cantidad', 'Observaciones'])
# Agregar los datos
for movimiento in movimientos:
ws.append([movimiento.fecha, movimiento.tipo_inventario, movimiento.bodega, movimiento.articulo, movimiento.cantidad, movimiento.observaciones])
# Guardar el archivo Excel
wb.save(response)
return response
def reporte_pdf(request):
# Obtener todos los movimientos de inventario
movimientos = movimiento_inventario.objects.all()
# Renderizar la plantilla HTML
html_string = render_to_string('reporte_pdf.html', {'movimientos': movimientos})
# Crear un objeto HttpResponse para el PDF
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="reporte_inventario.pdf"'
# Convertir HTML a PDF usando xhtml2pdf
pisa_status = pisa.CreatePDF(html_string, dest=response)
if pisa_status.err:
return HttpResponse('Error generando el PDF', status=500)
return response
def reporte_csv(request):
# Obtener todos los movimientos de inventario
movimientos = movimiento_inventario.objects.all()
# Crear la respuesta de archivo CSV
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="reporte_inventario.csv"'
# Crear el escritor de CSV
writer = csv.writer(response)
writer.writerow(['Fecha', 'Tipo de Movimiento', 'Bodega', 'Artículo', 'Cantidad', 'Observaciones'])
# Escribir los datos
for movimiento in movimientos:
writer.writerow([movimiento.fecha, movimiento.tipo_inventario, movimiento.bodega, movimiento.articulo, movimiento.cantidad, movimiento.observaciones])
return response

@ -45,7 +45,9 @@ urlpatterns = [
path('grafico/chartjs/',viewspdf.generar_grafico_chartjs, name ='generar_grafico_chartjs'),
path('ventas/',views.lista_ventas, name ='lista_ventas'),
path('ventas/nueva_venta/',views.nueva_venta, name ='nueva_venta'),
path('reportes/pdf/',viewspdf.reporte_pdf, name ='reporte_pdf'),
path('reportes/excel/',viewspdf.reporte_excel, name ='reporte_excel'),
path('reportes/csv/',viewspdf.reporte_csv, name ='reporte_csv'),

Loading…
Cancel
Save