SmartERP Documentation An Ashewa Technology Solutions Platform

Projects technical architecture

Complete data models, model inheritance, security access groups, background cron jobs, and developer extension APIs across SmartERP Projects modules.

SmartERP Projects extends Odoo 17 Community through modular, loosely-coupled addons. This reference document details the technical models, security groups, scheduled crons, and API extension points for developers and system administrators.

Model extension matrix#

Technical modelDefining moduleDescription and key fields
project.projectsmarterp_governance, smarterp_project_agile, smarterp_project_controlsInherited with: gate_state (0–4), scope_freeze_active, agile_dor_enforced, budget_status (none, ok, warning, critical), budget_line_ids, eac_amount, eac_variance.
project.tasksmarterp_governance, smarterp_project_agile, smarterp_project_approvalInherited with: gov_type (deliverable, change, raid), cr_class (A–D), sprint_id, story_points, estimate_state (draft, tl_review, tech_review, pm_review, approved, revision, rejected), initial_estimate_hours, blocker_priority, blocker_status, response_sla_due, resolution_sla_due.
project.sprintsmarterp_project_agileStandalone model: name, project_id, state (draft, active, closed, cancelled), date_start, date_end, committed_points, committed_hours, completed_points, velocity_rate.
project.budget.linesmarterp_project_controlsStandalone model: project_id, cost_category (labor, subcontract, software, hardware, travel), planned_amount, actual_amount, variance_amount.
project.dashboardsmarterp_project_dashboardSingle-record caching model: aggregates active project counts, gate distributions, sprint metrics, EAC variance, and commercial margins.
smart.timesheet.control.rulesmart_enterprise_timesheetStandalone model: name, active, calendar_id, escalation_line_ids, reminder_email_template_id.
smart.timesheet.period.locksmart_enterprise_timesheetStandalone model: company_id, lock_date, locked_by_user_id, active.
smart.et.holiday.occurrencesmart_et_calendarStandalone model: name, holiday_type (fixed, bahire_hasab, hijri), date_gregorian, date_ethiopian, is_working_day.

Security groups and access control#

SmartERP defines layered security groups in ir.model.access.csv and security XML definitions:

[ Project / User ] 
       │
       â–¼
[ Project / Manager ] ──► [ Governance / Approver ]
       │                         │
       â–¼                         â–¼
[ Project / Administrator ] ──► [ Delegation of Authority (DoA) Approver ]
                                 │
                                 â–¼
                     [ Timesheet / Override Period Lock ]
  • Segregation of Duties: Authors of Change Requests cannot approve Class D requests. Gate approvers must hold the group_governance_approver group.
  • Multi-Company Rules: All project, sprint, budget line, and timesheet models enforce standard ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] record rules.

Scheduled cron actions#

Cron technical IDFrequencyModuleAction executed
ir_cron_project_blocker_escalationEvery 4 hourssmarterp_project_agileEvaluates open blockers against response/resolution SLAs, increments escalation levels, and schedules activities.
ir_cron_project_budget_status_checkDaily (01:00 UTC)smarterp_project_controlsRecalculates EAC variance, updates budget_status, and alerts PM/CFO upon status degradation.
ir_cron_timesheet_compliance_reminderDaily (07:00 UTC)smart_enterprise_timesheetCompares previous day timesheets against working calendars and sends reminders/escalations.
ir_cron_generate_et_holidaysMonthly (1st of month)smart_et_calendarProjects Bahire Hasab and Hijri holidays for upcoming 24 months and creates non-working leaves.

Developer extension APIs#

Modules can listen to governance lifecycle events using standard Odoo method overrides or Python decorators:

from odoo import models, api

class CustomProject(models.Model):
    _inherit = 'project.project'

    def action_advance_gate(self, target_gate):
        """Custom hook executed when project advances through a stage gate."""
        res = super().action_advance_gate(target_gate)
        # Custom ERP integration logic here
        return res
Last updated: 2026-10-16