Skip to main content

Overview

Energy CMMS provides comprehensive budget planning, tracking, and material requisition workflows integrated with maintenance operations.

Budget Structure

Budgets are organized hierarchically:

Budget Components

Budget Lines

Major categories (disciplines) like Electrical, Mechanical, Civil

Items

Specific expense concepts within each line

Monthly Details

Projected spending distribution across months

Creating Annual Budgets

1

Navigate to Budgets

Go to Budgets > Annual Budgets
2

Create Budget

Click “Add Annual Budget”:
  • Year: Fiscal year
  • Name: Descriptive name (e.g., “2024 Maintenance Budget”)
  • Currency: Default currency
3

Add Budget Lines

Create lines by discipline:
  • Link to Discipline (auto-creates from Asset Categories)
  • Or use Description for custom lines
  • Set Projected Amount (optional, calculated from items)
4

Define Items

Within each line, create specific expense items:
  • Concept: What you’re budgeting for
  • Frequency: How often this expense occurs
  • Is Recurring: Auto-distribute across months
5

Distribute Across Months

For each item, set monthly projections:
  • Manual entry per month
  • Or use recurring patterns
  • Total validates against yearly amount

Budget Item Configuration

# Example: Creating recurring monthly expense
item = ItemPresupuesto.objects.create(
    partida=partida,
    concepto="Electrical Spare Parts",
    frecuencia='MENSUAL',
    es_recurrente=True
)

# Distribute equally across 12 months
for mes in range(1, 13):
    DetallePeriodico.objects.create(
        item=item,
        mes=mes,
        monto=1000.00  # $1,000 per month
    )

Budget Cronogram View

Visualize budget execution over time:
View one budget’s performance:
  • Monthly projected vs actual
  • By discipline breakdown
  • Item-level detail
  • Cumulative spending curves

Key Features

Edit projections directly in the cronogram:
  • Click any cell to modify
  • Real-time total recalculation
  • Instant validation
Color-coded status:
  • 🟢 Under budget
  • 🟡 On target
  • 🟠 Approaching limit
  • 🔴 Over budget
Click any value to see:
  • Contributing expenses
  • Related work orders
  • Material consumptions
  • Invoice details

Executing Against Budget

Record actual expenses:
1

Link to Budget Line

When creating expense, select:
  • Budget year
  • Budget line (discipline)
  • Specific item (if applicable)
2

Record Expense

GastoEjecutado model captures:
  • Date of expense
  • Amount
  • Description
  • Supporting documents
3

Automatic Tracking

System updates:
  • Monthly execution totals
  • Budget vs actual variance
  • Remaining balance
  • Alerts if over budget

Expense Recording

# Record an executed expense
gasto = GastoEjecutado.objects.create(
    partida=partida,
    fecha=date.today(),
    monto=850.50,
    descripcion="Motor repair parts",
    orden_trabajo=orden  # Optional link to work order
)
Expenses can be linked to work orders, material movements, or purchase orders for full traceability.

Material Requisitions

Request materials needed for maintenance:

Requisition Workflow

Creating Requisitions

1

Initiate Request

From work order or standalone:
  • Requestor
  • Delivery location
  • Required date
  • Priority level
2

Add Items

For each material:
  • Material/part number
  • Quantity required
  • Purpose/work order
  • Alternative options
3

Submit for Approval

Routing based on value:
  • Low value: Automatic approval
  • Medium: Supervisor approval
  • High: Manager approval
4

Warehouse Fulfillment

Once approved:
  • Generate pick list
  • Reserve stock
  • Prepare items
  • Schedule delivery
5

Receive & Consume

At delivery:
  • Technician confirms receipt
  • System records consumption
  • Updates work order costs
  • Reduces inventory

Requisition States

Being prepared:
  • Can add/remove items
  • Not yet submitted
  • No approvals started

Integration with Work Orders

Automatic material requisitions:
# Work order triggers requisition
orden = OrdenTrabajo.objects.get(id=123)

# System checks routine for required materials
if orden.rutina:
    materiales_necesarios = orden.rutina.materiales_requeridos.all()
    
    # Create requisition automatically
    requisicion = MaterialRequisition.objects.create(
        orden_trabajo=orden,
        solicitante=orden.tecnico,
        ubicacion_entrega=orden.ubicacion
    )
    
    # Add materials
    for item in materiales_necesarios:
        requisicion.items.create(
            material=item.material,
            cantidad=item.cantidad * orden.activos.count()
        )
Configure routine templates with standard materials to automatically generate requisitions when work orders are created.

Budget Reports

Standard Reports

Monthly Summary

Month-by-month analysis:
  • Projected vs actual
  • Variance analysis
  • Trending indicators

Discipline Breakdown

By category performance:
  • Each budget line
  • Item-level detail
  • Top expense drivers

Efficiency Metrics

Budget utilization:
  • % spent to date
  • Burn rate
  • Projected year-end

Variance Report

Over/under analysis:
  • Significant deviations
  • Root cause tracking
  • Corrective actions

Export Options

# Standard cronogram export
response = exportar_cronograma_excel(request, pk=budget_id)
Contains:
  • Disciplines as rows
  • Months as columns
  • Projected and actual values
  • Visual formatting

Budget Grouping

Consolidate multiple budgets:
1

Create Budget Group

Go to Budgets > Grouped Budgets:
  • Name (e.g., “All Sites 2024”)
  • Description
2

Add Budgets

Select individual budgets to include:
  • Different locations
  • Different departments
  • Different years (for comparison)
3

View Consolidated Analysis

Group view shows:
  • Total across all budgets
  • Per-budget breakdown
  • Comparative metrics
  • Drill-down capability

Group Analysis Features

# Consolidated monthly totals
data = _get_cronograma_data(presupuestos_list)

# Returns aggregated structure:
{
    'presupuestos_data': [...]  # Individual budget details
    'global_proyectado_mes': [...]  # Sum of all projected by month
    'global_ejecutado_mes': [...]  # Sum of all executed by month
    'total_general_proyectado': X  # Grand total projected
    'total_general_ejecutado': Y  # Grand total executed
}

Real-Time Budget Updates

Automatic updates from various sources:
When closing work order:
  • Labor hours recorded
  • Materials consumed
  • External services invoiced
  • All costs hit budget automatically
Material withdrawals:
  • Warehouse issues materials
  • Costed at average or FIFO
  • Charged to requisition’s budget line
When PO is received:
  • Accrual against budget
  • Final cost on invoice
  • Variance tracking
Direct expense recording:
  • Admin records cost
  • Links to budget line
  • Includes supporting docs

Forecasting and Projections

Automated Projections

# Extend current spending trends
from django.db.models import Sum
from datetime import date

# Calculate burn rate
meses_transcurridos = date.today().month
total_gastado = partida.gastos.aggregate(
    total=Sum('monto')
)['total'] or 0

burn_rate = total_gastado / meses_transcurridos
proyeccion_anual = burn_rate * 12

# Compare to budget
if proyeccion_anual > partida.monto_proyectado:
    alert_over_budget()

Scenario Planning

Create multiple budget versions to model different scenarios: conservative, expected, and optimistic.

Budget Alerts and Notifications

Automated monitoring:

Alert Types

Threshold Alerts

Notify when:
  • 75% of budget consumed
  • 90% of budget consumed
  • Budget exceeded

Variance Alerts

Significant deviations:
  • 20% over in any month
  • Unusual spending pattern
  • Large single transactions

Approval Alerts

Workflow notifications:
  • Pending approvals
  • Rejected requisitions
  • Awaiting documents

Forecasting Alerts

Projected issues:
  • Will exceed budget by year-end
  • Underspending (unexecuted work)
  • Reallocation opportunities

Budget vs Actual Analysis

Key performance indicators:
# Calculate variance metrics
from django.db.models import Sum, F

analysis = PartidaPresupuestaria.objects.annotate(
    ejecutado=Sum('gastos__monto'),
    varianza=F('monto_proyectado') - F('ejecutado'),
    pct_usado=F('ejecutado') * 100.0 / F('monto_proyectado')
).filter(
    presupuesto_anual__anio=2024
)

Visualization

Line chart showing:
  • Projected (dotted line)
  • Actual (solid line)
  • Cumulative curves
  • Variance shading

Best Practices

Monthly closeout process:
  • Review all expenses
  • Verify coding
  • Identify discrepancies
  • Accrue pending invoices
Granular tracking:
  • Don’t lump everything into one item
  • Separate predictable costs
  • Track by work type
  • Enable meaningful analysis
Year-over-year analysis:
  • Compare to previous years
  • Identify trends
  • Justify budget increases
  • Benchmark performance

CAPEX vs OPEX

Distinguish capital from operational expenses:
Recurring maintenance costs:
  • Routine maintenance
  • Consumables
  • Labor
  • Utilities
Expensed immediately, hits budget.
Configure budget lines with tipo field to distinguish CAPEX vs OPEX for proper financial reporting.

Integration Points

With Inventory

  • Material costs flow automatically
  • Requisition approval workflows
  • Stock valuation methods (FIFO, Average)

With Purchasing

  • Purchase order accruals
  • Vendor invoice matching
  • Three-way matching (PO, Receipt, Invoice)

With Maintenance

  • Work order cost accumulation
  • Labor hour costing
  • Equipment downtime costs

Next Steps:

Build docs developers (and LLMs) love