icons dashboard

This commit is contained in:
raman 2025-11-18 13:45:25 +05:30
parent a5113dd0e1
commit b22e8b417d
5 changed files with 119 additions and 118 deletions

View File

@ -14,7 +14,7 @@
'assets': {
'web.assets_backend': [
('include', 'web_grid._assets_pqgrid'),
'web/static/src/libs/fontawesome/css/font-awesome.css',
'web/static/src/libs/fontawesome/*',
# Internal module JS and XML files (ensure correct paths within 'static/src')
'dashboard/static/src/components/pqgrid_dashboard/pqgrid_stock_dashboard.js',
'dashboard/static/src/components/pqgrid_dashboard/pqgrid_sale_dashboard.js',

View File

@ -56,67 +56,66 @@
</div>
</div>
</div>
<div class="row mb-4">
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-primary mb-3">
<i class="fas fa-receipt fa-2x"></i>
</div>
<h6 class="card-title text-muted small mb-2">Total Invoices</h6>
<h4 class="text-primary fw-bold mb-0" t-esc="state.sale_rows.length"/>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-danger mb-3">
<i class="fas fa-industry fa-2x"></i>
</div>
<h6 class="card-title text-muted small mb-2">Total Production</h6>
<h4 class="text-danger fw-bold mb-0" t-esc="this.getTotalProductionValue()"/>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-warning mb-3">
<i class="fas fa-shopping-cart fa-2x"></i>
</div>
<h6 class="card-title text-muted small mb-2">Total Sale</h6>
<h4 class="text-warning fw-bold mb-0" t-esc="this.getTotalSaleValue()"/>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-success mb-3">
<i class="fas fa-chart-line fa-2x"></i>
</div>
<h6 class="card-title text-muted small mb-2">Total Margin</h6>
<h4 class="text-success fw-bold mb-0" t-esc="this.getTotalMarginValue()"/>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-info mb-3">
<i class="fas fa-percentage fa-2x"></i>
</div>
<h6 class="card-title text-muted small mb-2">Margin %</h6>
<h4 class="text-info fw-bold mb-0" t-esc="this.getMarginPercentage() + '%'"/>
</div>
</div>
<div class="row mb-4">
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-primary mb-3" style="font-size: 2rem;">
🧾
</div>
<h6 class="card-title text-muted small mb-2">Total Invoices</h6>
<h4 class="text-primary fw-bold mb-0" t-esc="state.sale_rows.length"/>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-danger mb-3" style="font-size: 2rem;">
🏭
</div>
<h6 class="card-title text-muted small mb-2">Total Production</h6>
<h4 class="text-danger fw-bold mb-0" t-esc="this.getTotalProductionValue()"/>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-warning mb-3" style="font-size: 2rem;">
🛒
</div>
<h6 class="card-title text-muted small mb-2">Total Sale</h6>
<h4 class="text-warning fw-bold mb-0" t-esc="this.getTotalSaleValue()"/>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-success mb-3" style="font-size: 2rem;">
📈
</div>
<h6 class="card-title text-muted small mb-2">Total Margin</h6>
<h4 class="text-success fw-bold mb-0" t-esc="this.getTotalMarginValue()"/>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-info mb-3" style="font-size: 2rem;">📊</div>
<h6 class="card-title text-muted small mb-2">Margin %</h6>
<h4 class="text-info fw-bold mb-0" t-esc="this.getMarginPercentage() + '%'"/>
</div>
</div>
</div>
</div>
<div class="card shadow-sm">
<div class="card-header bg-success text-white">
<h5 class="mb-0">

View File

@ -57,65 +57,67 @@
</div>
</div>
<div class="row mb-4">
<!-- Total Products Card -->
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-primary mb-3">
<i class="fas fa-cubes fa-2x"></i>
</div>
<h6 class="card-title text-muted small mb-2">Total Products</h6>
<h4 class="text-primary fw-bold mb-0">
<span t-esc="this.getTotalProductsCount()"/>
</h4>
<small class="text-muted" t-esc="'Across ' + this.getCategoryCount() + ' categories'"/>
</div>
</div>
</div>
<div class="row mb-4">
<!-- Current Stock Value Card -->
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-success mb-3">
<i class="fas fa-dollar-sign fa-2x"></i>
</div>
<h6 class="card-title text-muted small mb-2">Current Stock Value</h6>
<h4 class="text-success fw-bold mb-0" t-esc="this.getTotalStockValue()"/>
<small class="text-muted">Total inventory value</small>
</div>
</div>
</div>
<!-- Out of Stock Products Card -->
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-danger mb-3">
<i class="fas fa-times-circle fa-2x"></i>
</div>
<h6 class="card-title text-muted small mb-2">Out of Stock</h6>
<h4 class="text-danger fw-bold mb-0" t-esc="this.getOutOfStockCount()"/>
<small class="text-muted">Products need restocking</small>
</div>
</div>
</div>
<!-- Low Stock Percentage Card -->
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-info mb-3">
<i class="fas fa-exclamation-triangle fa-2x"></i>
</div>
<h6 class="card-title text-muted small mb-2">Low Stock Alert</h6>
<h4 class="text-info fw-bold mb-0" t-esc="this.getLowStockCount()"/>
<small class="text-muted">Below minimum levels</small>
</div>
</div>
<!-- Total Products Card -->
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-primary mb-3" style="font-size: 2rem;">
📦
</div>
<h6 class="card-title text-muted small mb-2">Total Products</h6>
<h4 class="text-primary fw-bold mb-0">
<span t-esc="this.getTotalProductsCount()"/>
</h4>
<small class="text-muted" t-esc="'Across ' + this.getCategoryCount() + ' categories'"/>
</div>
</div>
</div>
<!-- Current Stock Value Card -->
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-success mb-3" style="font-size: 2rem;">
💰
</div>
<h6 class="card-title text-muted small mb-2">Current Stock Value</h6>
<h4 class="text-success fw-bold mb-0" t-esc="this.getTotalStockValue()"/>
<small class="text-muted">Total inventory value</small>
</div>
</div>
</div>
<!-- Out of Stock Products Card -->
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-danger mb-3" style="font-size: 2rem;">
</div>
<h6 class="card-title text-muted small mb-2">Out of Stock</h6>
<h4 class="text-danger fw-bold mb-0" t-esc="this.getOutOfStockCount()"/>
<small class="text-muted">Products need restocking</small>
</div>
</div>
</div>
<!-- Low Stock Alert Card -->
<div class="col mb-4">
<div class="card shadow-sm h-100">
<div class="card-body text-center py-4">
<div class="text-info mb-3" style="font-size: 2rem;">
⚠️
</div>
<h6 class="card-title text-muted small mb-2">Low Stock Alert</h6>
<h4 class="text-info fw-bold mb-0" t-esc="this.getLowStockCount()"/>
<small class="text-muted">Below minimum levels</small>
</div>
</div>
</div>
</div>
<div class="card shadow-sm">
<div class="card-header bg-primary text-white">

View File

@ -24,7 +24,7 @@ class AssetDetail(models.Model):
quantity = fields.Float('Quantity', default=1.0, copy=False, tracking=True)
state = fields.Selection([('draft', 'New'), ('active', 'Active'), ('scrap', 'Scrap')], string='State', default="draft")
@api.model
@api.model_create_multi
def create(self, vals):
location_id = self.env["asset.location"].search([("is_default", "=", True)], limit=1)
vals["asset_code"] = self.env["ir.sequence"].next_by_code("asset.detail", sequence_date=datetime.now().year) or "New"

View File

@ -12,7 +12,7 @@ class AssetMove(models.Model):
asset_id = fields.Many2one(comodel_name="asset.detail", string="Asset")
state = fields.Selection([('draft', 'Draft'),('done', 'Done'),('cancel', 'Cancel')], string='State', default="draft")
@api.model
@api.model_create_multi
def create(self, vals):
vals["name"] = self.env["ir.sequence"].next_by_code("asset.move", sequence_date=datetime.now().year) or "New"
return super(AssetMove, self).create(vals)