icons dashboard
This commit is contained in:
parent
a5113dd0e1
commit
b22e8b417d
|
|
@ -14,7 +14,7 @@
|
||||||
'assets': {
|
'assets': {
|
||||||
'web.assets_backend': [
|
'web.assets_backend': [
|
||||||
('include', 'web_grid._assets_pqgrid'),
|
('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')
|
# 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_stock_dashboard.js',
|
||||||
'dashboard/static/src/components/pqgrid_dashboard/pqgrid_sale_dashboard.js',
|
'dashboard/static/src/components/pqgrid_dashboard/pqgrid_sale_dashboard.js',
|
||||||
|
|
|
||||||
|
|
@ -56,67 +56,66 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-4">
|
<div class="row mb-4">
|
||||||
<div class="col mb-4">
|
<div class="col mb-4">
|
||||||
<div class="card shadow-sm h-100">
|
<div class="card shadow-sm h-100">
|
||||||
<div class="card-body text-center py-4">
|
<div class="card-body text-center py-4">
|
||||||
<div class="text-primary mb-3">
|
<div class="text-primary mb-3" style="font-size: 2rem;">
|
||||||
<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>
|
</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>
|
||||||
|
|
||||||
|
<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 shadow-sm">
|
||||||
<div class="card-header bg-success text-white">
|
<div class="card-header bg-success text-white">
|
||||||
<h5 class="mb-0">
|
<h5 class="mb-0">
|
||||||
|
|
|
||||||
|
|
@ -57,65 +57,67 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-4">
|
<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>
|
|
||||||
|
|
||||||
<!-- Current Stock Value Card -->
|
<!-- Total Products Card -->
|
||||||
<div class="col mb-4">
|
<div class="col mb-4">
|
||||||
<div class="card shadow-sm h-100">
|
<div class="card shadow-sm h-100">
|
||||||
<div class="card-body text-center py-4">
|
<div class="card-body text-center py-4">
|
||||||
<div class="text-success mb-3">
|
<div class="text-primary mb-3" style="font-size: 2rem;">
|
||||||
<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>
|
|
||||||
</div>
|
</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>
|
||||||
|
|
||||||
|
<!-- 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 shadow-sm">
|
||||||
<div class="card-header bg-primary text-white">
|
<div class="card-header bg-primary text-white">
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ class AssetDetail(models.Model):
|
||||||
quantity = fields.Float('Quantity', default=1.0, copy=False, tracking=True)
|
quantity = fields.Float('Quantity', default=1.0, copy=False, tracking=True)
|
||||||
state = fields.Selection([('draft', 'New'), ('active', 'Active'), ('scrap', 'Scrap')], string='State', default="draft")
|
state = fields.Selection([('draft', 'New'), ('active', 'Active'), ('scrap', 'Scrap')], string='State', default="draft")
|
||||||
|
|
||||||
@api.model
|
@api.model_create_multi
|
||||||
def create(self, vals):
|
def create(self, vals):
|
||||||
location_id = self.env["asset.location"].search([("is_default", "=", True)], limit=1)
|
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"
|
vals["asset_code"] = self.env["ir.sequence"].next_by_code("asset.detail", sequence_date=datetime.now().year) or "New"
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ class AssetMove(models.Model):
|
||||||
asset_id = fields.Many2one(comodel_name="asset.detail", string="Asset")
|
asset_id = fields.Many2one(comodel_name="asset.detail", string="Asset")
|
||||||
state = fields.Selection([('draft', 'Draft'),('done', 'Done'),('cancel', 'Cancel')], string='State', default="draft")
|
state = fields.Selection([('draft', 'Draft'),('done', 'Done'),('cancel', 'Cancel')], string='State', default="draft")
|
||||||
|
|
||||||
@api.model
|
@api.model_create_multi
|
||||||
def create(self, vals):
|
def create(self, vals):
|
||||||
vals["name"] = self.env["ir.sequence"].next_by_code("asset.move", sequence_date=datetime.now().year) or "New"
|
vals["name"] = self.env["ir.sequence"].next_by_code("asset.move", sequence_date=datetime.now().year) or "New"
|
||||||
return super(AssetMove, self).create(vals)
|
return super(AssetMove, self).create(vals)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue