commit
751045c120
@ -1,3 +1,3 @@ |
||||
venv/ |
||||
__pycahe__ |
||||
settings |
||||
*.pyc |
||||
__pycache__/ |
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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 %}">📝</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' %}" >💾</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 %} |
||||
|
||||
@ -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 %}">📝</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' %}" >💾</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> |
||||
@ -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"> |
||||
📂 |
||||
</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"> |
||||
📂 |
||||
</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' %}" >💾</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"> |
||||
📂 |
||||
</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 %} |
||||
@ -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,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 %}">📝</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 %}"> |
||||
📝 |
||||
</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' %}" >💾</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> |
||||
@ -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 %}">📝</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 %}"> |
||||
📝 |
||||
</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' %}" >💾</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 %} |
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue