142 lines
5.5 KiB
HTML
142 lines
5.5 KiB
HTML
{% extends 'base.html' %}
|
|
|
|
{% block title %}Inventory Dashboard - Manufacturing App{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
|
|
<h1 class="h2">Inventory Dashboard</h1>
|
|
<div class="btn-toolbar mb-2 mb-md-0">
|
|
<div class="btn-group me-2">
|
|
<a href="{% url 'inventory:product_list' %}" class="btn btn-sm btn-outline-primary">
|
|
<i class="fas fa-box"></i> Products
|
|
</a>
|
|
<a href="{% url 'inventory:warehouse_list' %}" class="btn btn-sm btn-outline-primary">
|
|
<i class="fas fa-warehouse"></i> Warehouses
|
|
</a>
|
|
<a href="{% url 'inventory:movement_list' %}" class="btn btn-sm btn-outline-primary">
|
|
<i class="fas fa-exchange-alt"></i> Movements
|
|
</a>
|
|
</div>
|
|
<a href="{% url 'inventory:create_product' %}" class="btn btn-sm btn-outline-success">
|
|
<i class="fas fa-plus"></i> Add Product
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<!-- Total Products Widget -->
|
|
<div class="col-md-4 mb-4">
|
|
<div class="card h-100">
|
|
<div class="card-body text-center">
|
|
<i class="fas fa-boxes fa-3x text-primary mb-3"></i>
|
|
<div class="display-4 text-primary">{{ products|length }}</div>
|
|
<h5 class="card-title">Total Products</h5>
|
|
<p class="card-text text-muted">Active products in inventory</p>
|
|
<a href="{% url 'inventory:product_list' %}" class="btn btn-primary">
|
|
<i class="fas fa-eye me-2"></i>View Products
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Warehouses Widget -->
|
|
<div class="col-md-4 mb-4">
|
|
<div class="card h-100">
|
|
<div class="card-body text-center">
|
|
<i class="fas fa-warehouse fa-3x text-success mb-3"></i>
|
|
<div class="display-4 text-success">{{ warehouses|length }}</div>
|
|
<h5 class="card-title">Warehouses</h5>
|
|
<p class="card-text text-muted">Storage locations</p>
|
|
<a href="{% url 'inventory:warehouse_list' %}" class="btn btn-success">
|
|
<i class="fas fa-eye me-2"></i>View Warehouses
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Categories Widget -->
|
|
<div class="col-md-4 mb-4">
|
|
<div class="card h-100">
|
|
<div class="card-body text-center">
|
|
<i class="fas fa-tags fa-3x text-info mb-3"></i>
|
|
<div class="display-4 text-info">{{ categories|length }}</div>
|
|
<h5 class="card-title">Categories</h5>
|
|
<p class="card-text text-muted">Product categories</p>
|
|
<a href="{% url 'inventory:category_list' %}" class="btn btn-info">
|
|
<i class="fas fa-eye me-2"></i>View Categories
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mt-4">
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="mb-0">Low Stock Alert</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
{% if low_stock_products %}
|
|
<div class="table-responsive">
|
|
<table class="table table-sm">
|
|
<thead>
|
|
<tr>
|
|
<th>Product</th>
|
|
<th>Quantity</th>
|
|
<th>Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for product in low_stock_products %}
|
|
<tr>
|
|
<td>{{ product.name }}</td>
|
|
<td>{{ product.total_quantity }}</td>
|
|
<td><span class="badge bg-warning">Low Stock</span></td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% else %}
|
|
<p class="text-muted">No low stock items</p>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="mb-0">Recent Stock Movements</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
{% if recent_movements %}
|
|
<div class="list-group list-group-flush">
|
|
{% for movement in recent_movements %}
|
|
<div class="list-group-item">
|
|
<div class="d-flex w-100 justify-content-between">
|
|
<h6 class="mb-1">{{ movement.product.name }}</h6>
|
|
<small>{{ movement.created_at|date:"M d, Y" }}</small>
|
|
</div>
|
|
<p class="mb-1">{{ movement.get_movement_type_display }}: {{ movement.quantity }}</p>
|
|
<small>{{ movement.warehouse.name }}</small>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% else %}
|
|
<p class="text-muted">No recent movements</p>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block extra_js %}
|
|
<script>
|
|
// Auto-refresh dashboard data
|
|
setInterval(function() {
|
|
location.reload();
|
|
}, 300000); // Refresh every 5 minutes
|
|
</script>
|
|
{% endblock %} |