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

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

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

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

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

@ -1,54 +1,61 @@
{% extends "Base.html" %} {% extends "Base.html" %}
{% block content %} {% block content %}
<main class="conteiner"> <main class="container my-5">
<div class="row"> <div class="row justify-content-center">
<div class="col-md-10 offset-md-1 mt-4"> <div class="col-md-10">
<form action="/bodega/" method="POST"> <div class="card shadow-lg border-0">
<div class="card-header row col-12 justify-content-end mb-2 pr-0 mt-2"> <div class="card-header text-center bg-secondary text-white">
<h3 class="text-center">Tabla de Bodega</h3> <h3 class="mb-0">Tabla de Bodega</h3>
</div> </div>
<div class="card-body p-4">
<div class="table-responsive"> <div class="table-responsive">
<table class="table mt-3"> <table class="table table-bordered table-hover align-middle text-white">
<thead class="table-dark"> <thead class="bg-dark text-secondary text-center">
<tr> <tr>
<th scope="col">#</th> <th scope="col">#</th>
<th scope="col">Codigo de la bodega</th> <th scope="col">Código de la Bodega</th>
<th scope="col">Nombre la bodega</th> <th scope="col">Nombre de la Bodega</th>
<th scope="col">Estado</th> <th scope="col">Estado</th>
<th scope="col">Direccion</th> <th scope="col">Dirección</th>
<th scope="col">ACTUALIZAR</th> <th scope="col">Actualizar</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for bodega in persona %} {% for bodega in persona %}
<tr> <tr class="text-center">
<th scope="row"> {{bodega.id}} </th> <td>{{ bodega.id }}</td>
<td> {{bodega.codigo_bodega}} </td> <td>{{ bodega.codigo_bodega }}</td>
<td> {{bodega.nombre_bodega}} </td> <td>{{ bodega.nombre_bodega }}</td>
{% if bodega.estado %} <td>
<td> activo </td> {% if bodega.estado %}
{% else %} Activo
<td> inactivo </td> {% else %}
{% endif %} Inactivo
<td> {{bodega.direccion_bodega}} </td> {% endif %}
<td class="text-center"> <a class="btn btn-secondary" href="{% url 'bodega_update' bodega.id %}">&#128221;</a> </td> </td>
</tr> <td>{{ bodega.direccion_bodega }}</td>
{% endfor %} <td>
</tbody> <a class="btn btn-sm btn-dark text-white " href="{% url 'bodega_update' bodega.id %}">
</table> <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> </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> </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> </main>
{% endblock %} {% endblock %}

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

@ -1,36 +1,94 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <!DOCTYPE html>
<html lang="es">
<head> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gráfico Interactivo</title> <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> <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> </head>
<body> <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> <script>
const ctx = document.getElementById('grafico').getContext('2d'); 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, { const myChart = new Chart(ctx, {
type: 'bar', type: 'pie', // Tipo de gráfico de pastel
data: { data: {
labels: {{ productos|safe }}, // Nombres de los productos labels: productosConMedida, // Nombres de los productos con medida
datasets: [{ datasets: [{
label: 'Cantidad de Productos', label: 'Cantidad de Productos',
data: {{ cantidades|safe }}, // Cantidades de productos data: {{ cantidades|safe }}, // Cantidades de productos
backgroundColor: 'rgba(75, 192, 192, 0.2)', backgroundColor: [
borderColor: 'rgba(75, 192, 192, 1)', '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 borderWidth: 1
}] }]
}, },
options: { options: {
scales: { responsive: true,
y: { plugins: {
beginAtZero: true legend: {
position: 'top',
},
tooltip: {
callbacks: {
label: function(tooltipItem) {
return tooltipItem.label + ': ' + tooltipItem.raw + ' productos';
}
}
} }
} }
} }
}); });
</script> </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> </body>
</html> </html>

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

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

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

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

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

@ -1,36 +1,172 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="es">
<head> <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> <style>
body { font-family: Arial, sans-serif; } /* Estilos generales */
table { width: 100%; border-collapse: collapse; margin-top: 20px; } body {
th, td { border: 1px solid #000; padding: 8px; text-align: left; } font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
th { background-color: #f2f2f2; } 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> </style>
</head> </head>
<body> <body>
<h1>Reporte de Inventario</h1>
<table> <div class="container">
<thead> <h1>Reporte de Inventario</h1>
<tr>
<th>ID</th> <!-- Canvas para el gráfico de pastel -->
<th>Bodega</th> <canvas id="grafico"></canvas>
<th>Artículo</th>
<th>Cantidad</th> <table>
<th>Precio</th> <thead>
</tr> <tr>
</thead> <th>ID</th>
<tbody> <th>Bodega</th>
{% for item in inventarios %} <th>Artículo</th>
<tr> <th>Cantidad</th>
<td>{{ item.id }}</td> </tr>
<td>{{ item.bodega.nombre_bodega }}</td> </thead>
<td>{{ item.articulo.nombre_articulo }}</td> <tbody>
<td>{{ item.cantidad }}</td> {% for item in inventarios %}
<td>{{ item.precio }}</td> <tr>
</tr> <td>{{ item.id }}</td>
{% endfor %} <td>{{ item.bodega.nombre_bodega }}</td>
</tbody> <td>{{ item.articulo.nombre_articulo }}</td>
</table> <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> </body>
</html> </html>

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

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

@ -1,29 +1,27 @@
{% extends "Base.html" %} {% extends "Base.html" %}
{% block content %} {% block content %}
<main class="conteiner">
<div class="row"> <main class="container my-5">
<div class="col-md-8 offset-md-2 mt-4"> <div class="row justify-content-center">
<form method="POST"> <div class="col-lg-6 col-md-8 col-sm-12">
<div class="card"> <form method="POST" class="shadow-lg p-4 bg-light rounded">
<div class="card-header text-bg-secondary"> {% csrf_token %}
<h4 class="text-center">Actualizar proveedor</h4> <h3 class="text-center text-secondary mb-4">Actualizar Proveedor</h3>
</div> <div class="mb-3">
<div class="card-body"> {{ form }}
</div>
{% csrf_token %} <div class="d-flex justify-content-between align-items-center mt-4">
{{form}} <a href="{% url 'proveedor' %}" class="btn btn-outline-danger">
<i class="bi bi-x-circle"></i> Cancelar
</div> </a>
<div class="card-footer"> <button type="submit" class="btn btn-primary">
<div class="gap-3 d-md-flex justify-content-md-end mb-3"> <i class="bi bi-save"></i> Actualizar proveedor
<a class="btn btn-danger" href="{% url 'proveedor' %}">Cancelar</a> </button>
<button class="btn btn-primary ">Actualizar proveedor</button>
</div>
</div>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</main> </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 %} {% block content %}
<main class="conteiner"> <main class="container">
<div class="row"> <div class="row justify-content-center">
<div class="col-md-4 offset-md-4 mt-5"> <div class="col-md-6 col-lg-4 mt-5">
<form action="/signin/" method="POST" class="card card-body"> <div class="card shadow-lg border-0">
<h1 class="text-center">Login</h1> <div class="card-body p-4">
{% csrf_token %} <h2 class="text-center mb-4">Iniciar Sesión</h2>
<div class="mb-3"> <form action="/signin/" method="POST">
<label for="username"> Usuario:</label> {% csrf_token %}
<input type="text" name="username" id="username"
class="form-control" placeholder="Escribe tu usuario"> <div class="mb-4">
</div> <label for="username" class="form-label">Usuario:</label>
<div class="mb-3"> <input type="text" name="username" id="username" class="form-control" placeholder="Escribe tu usuario" required>
<label for="password"> Contraseña:</label> </div>
<input type="password" name="password" id="password" <div class="mb-4">
class="form-control" placeholder="escribe tu contraseña"> <label for="password" class="form-label">Contraseña:</label>
</div> <input type="password" name="password" id="password" class="form-control" placeholder="Escribe tu contraseña" required>
<button class="btn btn-primary"> Signin </button> </div>
</form> <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>
</div> </div>
</main> </main>
{% endblock %} {% endblock %}

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

@ -1,44 +1,53 @@
{% extends "Base.html" %} {% extends "Base.html" %}
{% block content %} {% block content %}
<main class="conteiner"> <main class="container my-5">
<div class="row"> <div class="row justify-content-center">
<div class="col-md-10 offset-md-1 mt-4"> <div class="col-md-10">
<form action="/tipo/" method="POST"> <div class="card shadow-lg border-0">
<div class="card-header"> <div class="card-header text-center bg-secondary text-white">
<h3 class="text-center">Tabla de tipos de articulos</h3> <h3 class="mb-0">Tabla de Tipos de Artículos</h3>
</div> </div>
<div class="card-body p-4">
<div class="table-responsive"> <div class="table-responsive">
<table class="table mt-3"> <table class="table table-bordered table-hover align-middle text-white">
<thead class="table-dark"> <thead class="bg-dark text-secondary text-center">
<tr> <tr>
<th scope="col">#</th> <th scope="col">#</th>
<th scope="col">tipo de articulo</th> <th scope="col">Tipo de Artículo</th>
<th scope="col">Descripcion</th> <th scope="col">Descripción</th>
<th scope="col">ACTUALIZAR</th> <th scope="col">Actualizar</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for tipo_articulo in persona %} {% for tipo_articulo in persona %}
<tr> <tr class="text-center">
<th scope="row"> {{tipo_articulo.id}} </th> <td>{{ tipo_articulo.id }}</td>
<td> {{tipo_articulo.tipo_articulo}} </td> <td>{{ tipo_articulo.tipo_articulo }}</td>
<td> {{tipo_articulo.descripcion}} </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> <td>
{% endfor %} <a class="btn btn-secondary rounded-pill" href="{% url 'tipo_update' tipo_articulo.id %}">
</tbody> &#128221;
</table> </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> </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 'tipo_registro' %}" >&#128190</a>
<br>
<br>
</div> </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> </main>
{% endblock %} {% endblock %}

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

@ -1,16 +1,17 @@
{% extends "Base.html" %} {% extends "Base.html" %}
{% block content %} {% block content %}
<main class="conteiner"> <main class="container my-5">
<div class="row"> <div class="row justify-content-center">
<div class="col-md-10 offset-md-1 mt-4"> <div class="col-md-10">
<form action="/ventas/" method="POST"> <div class="card shadow-lg border-0">
<div class="card-header"> <div class="card-header text-center bg-secondary text-white">
<h3 class="text-center">Tabla de ventas</h3> <h3 class="mb-0">Tabla de Ventas</h3>
</div> </div>
<div class="card-body p-4">
<div class="table-responsive"> <div class="table-responsive">
<table class="table mt-3"> <table class="table table-bordered table-hover align-middle text-white">
<thead class="table-dark"> <thead class="bg-dark text-secondary text-center">
<tr> <tr>
<th scope="col">#</th> <th scope="col">#</th>
<th scope="col">Fecha</th> <th scope="col">Fecha</th>
@ -24,8 +25,8 @@
</thead> </thead>
<tbody> <tbody>
{% for venta in ventas %} {% for venta in ventas %}
<tr> <tr class="text-center">
<th scope="row"> {{venta.id}} </th> <td>{{ venta.id }}</td>
<td>{{ venta.fecha }}</td> <td>{{ venta.fecha }}</td>
<td>{{ venta.bodega }}</td> <td>{{ venta.bodega }}</td>
<td>{{ venta.articulo.nombre_articulo }}</td> <td>{{ venta.articulo.nombre_articulo }}</td>
@ -34,21 +35,23 @@
<td>${{ venta.total }}</td> <td>${{ venta.total }}</td>
<td>{{ venta.observaciones }}</td> <td>{{ venta.observaciones }}</td>
</tr> </tr>
{% endfor %} {% empty %}
</tbody> <tr>
</table> <td colspan="8" class="text-center text-muted">No hay ventas registradas.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div> </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> </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> </main>
{% endblock %} {% endblock %}

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

@ -2,10 +2,10 @@ from django.contrib.auth.decorators import login_required
from django.http import HttpResponse from django.http import HttpResponse
import openpyxl import openpyxl
import csv import csv
from django.template.loader import get_template from django.template.loader import get_template, render_to_string
from xhtml2pdf import pisa from xhtml2pdf import pisa
from django.shortcuts import render from django.shortcuts import render
from .models import inventario from .models import inventario, movimiento_inventario
@login_required @login_required
def generar_reporte_pdf(request): def generar_reporte_pdf(request):
@ -39,12 +39,12 @@ def generar_reporte_excel(request):
ws.title = 'Reporte de Inventario' ws.title = 'Reporte de Inventario'
# Encabezados # Encabezados
headers = ['ID', 'Bodega', 'Artículo', 'Cantidad', 'Precio'] headers = ['ID', 'Bodega', 'Artículo', 'Cantidad']
ws.append(headers) ws.append(headers)
# Datos del inventario # Datos del inventario
for item in inventario.objects.all(): 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 # Configurar la respuesta HTTP
response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
@ -63,21 +63,88 @@ def generar_reporte_csv(request):
writer = csv.writer(response) writer = csv.writer(response)
# Encabezados # Encabezados
writer.writerow(['ID', 'Bodega', 'Artículo', 'Cantidad', 'Precio']) writer.writerow(['ID', 'Bodega', 'Artículo', 'Cantidad'])
# Datos del inventario # Datos del inventario
for item in inventario.objects.all(): 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 return response
@login_required @login_required
def generar_grafico_chartjs(request): def generar_grafico_chartjs(request):
# Obtener todos los inventarios
inventarios = inventario.objects.all() 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] productos = [item.articulo.nombre_articulo for item in inventarios]
cantidades = [item.cantidad 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', { return render(request, 'grafico_chartjs.html', {
'productos': productos, 'productos': productos,
'cantidades': cantidades, '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('grafico/chartjs/',viewspdf.generar_grafico_chartjs, name ='generar_grafico_chartjs'),
path('ventas/',views.lista_ventas, name ='lista_ventas'), path('ventas/',views.lista_ventas, name ='lista_ventas'),
path('ventas/nueva_venta/',views.nueva_venta, name ='nueva_venta'), 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