Skip to content

Odoo Modules — Complete Object Reference

Purpose: Every Odoo module, every model it owns, what each model is, and its relevance to the SA governance system (x_actor_id / x_sa_id stamping). Includes all core and optional modules available in Odoo 18 Enterprise and Community.

Last updated: 2026-04-23 Companion doc: GOVERNED_OBJECTS.md — detailed stamp implementation notes for objects already in our workflow.


Status Legend

Symbol Meaning
Already stamped in this codebase
🔴 Should be stamped — high priority
🟡 Should be stamped — medium priority
🟢 Could be stamped — low priority / future
⚙️ No stamp needed — config, infrastructure, or inherited from parent
🏭 Relevant to manufacturing workflow
📡 Relevant to IoT workflow

Module Index

  1. Base & Core
  2. Sales
  3. CRM
  4. Accounting & Finance
  5. Inventory & Warehouse
  6. Manufacturing (MRP)
  7. Quality Control
  8. Product Lifecycle Management (PLM)
  9. Maintenance
  10. Repairs
  11. Field Service
  12. IoT
  13. Point of Sale (POS)
  14. Purchase
  15. Fleet
  16. Human Resources (HR)
  17. Payroll
  18. Recruitment
  19. Appraisals
  20. Time Off (Leave)
  21. Attendances
  22. Expenses
  23. Project
  24. Timesheets
  25. Planning
  26. Helpdesk
  27. Rental
  28. Subscription (Native Odoo)
  29. eCommerce & Website
  30. Blog
  31. Live Chat
  32. Email Marketing (Mass Mailing)
  33. SMS Marketing
  34. Social Media
  35. Events
  36. Surveys
  37. eLearning
  38. Sign
  39. Documents
  40. VoIP
  41. Discuss (Messaging)
  42. Lunch
  43. Referrals
  44. Barcode
  45. Accounting Localisations
  46. Complete Object Table

1. Base & Core

The base module is the foundation of every Odoo installation. Its models are present in every database regardless of which apps are installed.

res.partner

The universal contact record. Represents people, companies, customers, suppliers, and system users. Every monetary transaction, communication, and governance stamp traces back to a res.partner. This is the most important model in Odoo. Already stamped in this codebase — see partner_ext.py.

res.company ⚙️

Multi-company tenant. Each Odoo company is a separate organisational unit with its own chart of accounts, warehouses, and users. In this codebase, company_id is the coarse multi-tenant boundary; ov.serviced_account provides the fine-grained governance layer within a company. Root SAs are auto-created from res.company records.

res.users ⚙️

Odoo login identity. Every person who logs into the Odoo backend or portal is a res.users record linked to a res.partner. In this system, abs.employee represents field agents as free-seat identities outside res.users. Portal customers have res.users records with group_portal.

res.country / res.country.state ⚙️

Geographic reference data. Countries and states/provinces. Used on addresses. Config data — no stamp needed.

res.currency ⚙️

Currency master. Stores exchange rates and currency definitions. Config data.

res.lang ⚙️

Language definitions. Controls UI language and date/number formatting. Config data.

ir.config_parameter ⚙️

System parameters. Key-value store for system-wide settings (e.g. web.base.url). Used in this codebase for portal session storage (legacy). Config/infrastructure.

ir.rule ⚙️

Record access rules. Defines which records each user group can read/write. The right long-term home for SA-level visibility enforcement. No stamp needed on this model itself.

ir.model.access ⚙️

Model-level access control. Grants or denies CRUD permissions per group on each model. Config infrastructure.

ir.attachment 🟢

File attachments. Every file uploaded and attached to an Odoo record lives here. If agents upload site photos or customer documents during an SA-governed interaction, stamping the attachment enables "show all files uploaded by SA X". Low priority today.

ir.cron ⚙️

Scheduled jobs. Background tasks that run on a timer. Infrastructure.

ir.sequence ⚙️

Auto-numbering sequences. Generates reference numbers (SO001, INV002, etc.). Infrastructure.


2. Sales

Module name: sale / sale_management

sale.order

Sales order / quotation. The primary commercial document. Fully described in GOVERNED_OBJECTS.md. Already stamped with x_actor_id, x_sa_id, x_sales_rep_id, x_outlet_id, x_channel_partner_id, and approval workflow fields.

sale.order.line ⚙️

Order line. Single product line within a sale.order. Inherits SA context from parent order. No independent stamp needed.

sale.report ⚙️

Sales analysis view. A PostgreSQL view (not a real table) used for the Sales Analysis report. Not a transactional object — no stamp.

sale.payment.provider.onboarding.wizard ⚙️

Setup wizard. One-time onboarding helper. No stamp.


3. CRM

Module name: crm

crm.lead

Lead / opportunity. The sales pipeline object. Fully stamped — x_actor_id + x_sa_id. See crm_lead_ext.py.

crm.stage ⚙️

Pipeline stage. Configuration — New, Qualified, Proposal, Won, Lost. Shared config, no stamp.

crm.team ⚙️

Sales team. Groups salespeople. Config data. SA structure replaces the team grouping function in this system.

crm.team.member ⚙️

Team membership. Links res.users to a crm.team. Config, no stamp.

crm.activity.type ⚙️

Activity type. Defines categories of follow-up activities (call, email, meeting). Config.

crm.tag ⚙️

Lead tag. Classification tags applied to leads. Config/reference data.

crm.lost.reason ⚙️

Lost reason. Why an opportunity was lost. Reference data.


4. Accounting & Finance

Module name: account / account_accountant

account.move 🔴

Invoice / credit note / vendor bill / journal entry. The central accounting document. Every revenue event — when an agent sells and invoices a customer — creates an account.move. Currently not stamped. Full reasoning in GOVERNED_OBJECTS.md. This is a high-priority gap.

account.move.line ⚙️

Journal entry line. A single debit or credit line within an account.move. Inherits context from the parent move. No independent stamp.

account.payment 🟡

Registered payment. Represents money received or sent — cash, bank transfer, mobile money. Created when an agent manually registers a payment or when a payment gateway webhook confirms. Should carry x_sa_id to enable per-SA collections reporting.

account.payment.term ⚙️

Payment schedule / terms. Config — "Net 30 days", "50% upfront, 50% on delivery". No stamp.

account.payment.term.line ⚙️

Payment term line. A single instalment rule within a payment term. Config.

account.journal ⚙️

Accounting journal. Groups entries by type (Sales, Bank, Cash, Miscellaneous). Config.

account.account ⚙️

Chart of accounts entry. Each account in the company's chart of accounts. Config.

account.account.type ⚙️

Account type. Receivable, payable, expense, income, etc. Config.

account.tax ⚙️

Tax definition. VAT, withholding tax, etc. Config/reference data.

account.tax.group ⚙️

Tax group. Groups taxes for display on invoices. Config.

account.fiscal.position ⚙️

Fiscal position. Maps taxes and accounts per country/customer category. Config.

account.analytic.account 🟡

Analytic account. Tracks costs and revenues by business dimension (project, cost centre, territory). If one analytic account is created per SA, this becomes the financial reporting anchor for each SA — enabling P&L per SA without custom reports.

account.analytic.line 🟡

Analytic entry line. A single revenue or cost allocation to an analytic account. If analytic accounts are SA-aligned, stamping analytic lines enables precise per-SA financial reporting.

account.analytic.plan ⚙️

Analytic plan. Groups analytic accounts into a plan dimension (projects, departments, etc.). Config.

account.bank.statement ⚙️

Bank statement. Represents an imported bank statement for reconciliation. System/accounting infrastructure.

account.bank.statement.line ⚙️

Bank statement line. A single transaction line from a bank statement. Infrastructure.

account.reconcile.model ⚙️

Reconciliation rule. Automatic matching rules for bank statement lines to journal entries. Config.

account.incoterms ⚙️

International trade terms. EXW, FOB, CIF, etc. Reference data.

account.cash.rounding ⚙️

Cash rounding. Rules for rounding invoice totals to nearest coin denomination. Config.


5. Inventory & Warehouse

Module name: stock / inventory

stock.picking 🟡

Delivery order / receipt / internal transfer. The logistics document that governs the movement of physical goods. When a solar kit is delivered to a customer, a stock.picking is validated. Stamping it answers "how many deliveries did SA X make this quarter?"

stock.move ⚙️

Stock movement line. A single product quantity moved between locations within a stock.picking. Inherits context from the parent picking. No independent stamp.

stock.move.line ⚙️

Detailed move line. Detailed lot/serial tracking at the move level. Inherits from stock.move. No stamp.

stock.lot 🟡

Serial number / lot. The permanent identity record of a physical unit when serial tracking is enabled. A solar kit's serial number is a stock.lot. Stamping links a serial number to the SA under which it was deployed. Coordinate with ov.asset to avoid double-stamping — ov.asset is likely the correct governance wrapper; stock.lot is the underlying identity.

stock.quant ⚙️

On-hand stock quantity. Odoo's internal ledger of available stock at each location. System-maintained. No stamp.

stock.location ⚙️

Storage location. Defines physical or virtual locations: warehouses, shelves, customer locations, virtual/adjustment locations. Config/master data. No stamp.

stock.warehouse ⚙️

Warehouse definition. A warehouse or distribution centre with routes, picking types, and locations. Config.

stock.route ⚙️

Stock route. Defines how products flow through the warehouse (Buy → Receive → Store → Deliver). Config.

stock.rule ⚙️

Reorder / procurement rule. Triggers automatic replenishment when stock falls below a minimum. Config.

stock.warehouse.orderpoint 🟢

Reorder rule. Minimum/maximum stock level per product per location. Triggers automatic purchase or manufacturing orders. Low priority for SA stamping.

stock.scrap 🟢

Scrap / disposal record. Writes off damaged or end-of-life units from inventory. In a solar business, this represents a decommissioned kit. Low priority today — add when asset decommissioning workflow is built.

stock.backorder.confirmation ⚙️

Backorder wizard. Transient wizard for handling partial deliveries. Not a persistent record.

stock.picking.type ⚙️

Operation type. Defines categories of transfers (receipts, deliveries, internal). Config.

stock.valuation.layer ⚙️

Inventory valuation layer. Financial valuation record for each stock movement (AVCO, FIFO). Accounting infrastructure.

stock.landed.cost 🟢

Landed cost. Distributes additional costs (freight, customs) across received goods to adjust their valuation. Low priority for SA stamping.


6. Manufacturing (MRP)

Module name: mrp

Manufacturing is highly relevant to a hardware business (solar kits, batteries, meters). Even if Omnivoltaic does not manufacture in-house, understanding MRP objects is important for kit assembly, BOM management, and production tracking.

mrp.production 🟡

Manufacturing order (MO). The core document of the manufacturing module. Represents an instruction to produce a quantity of a finished product from its components. When a kit is assembled from parts (chassis + battery + controller + cable), a manufacturing order is created.

Key fields: - product_id — what is being produced - bom_id — Bill of Materials driving the production - qty_producing — quantity currently being manufactured - state — draft → confirmed → progress → to_close → done / cancel - workcenter_id — where production happens - date_planned_start / date_planned_finished - lot_producing_idstock.lot — the serial number of the finished unit

SA governance relevance: If production orders are tied to SA-specific customer contracts (e.g. "assemble 20 kits for SA Togo Q2"), stamping the MO enables per-SA production tracking and delivery pipeline visibility. Medium priority.

mrp.bom ⚙️

Bill of Materials (BOM). Defines what components and operations are needed to produce one unit of a product. A solar kit BOM might list: 1× solar panel, 1× battery, 1× charge controller, 2× cables.

BOM types: - normal — standard production BOM - phantom — kit BOM (used for packing / bundling without a production order) - subcontract — components sent to a supplier for assembly

No stamp needed — this is a product template definition, not a transaction record.

mrp.bom.line ⚙️

BOM component line. A single component within a mrp.bom. Defines product, quantity, unit of measure, and optional routing step. Config/template data.

mrp.bom.byproduct ⚙️

BOM by-product. A secondary output of a manufacturing process (e.g. scrap material recovered during assembly). Config.

mrp.routing.workcenter ⚙️

Routing / work centre operation. Defines a step in the production process performed at a specific work centre (e.g. "Step 1: Weld frame at Work Centre A — 30 min"). Config.

mrp.workcenter ⚙️

Work centre. A machine, workstation, or production area with a defined capacity and cost. Examples: "Assembly Line 1", "Quality Inspection Bay", "Packaging Station". Config/master data.

mrp.workcenter.productivity 🟢

Work centre downtime / productivity log. Records periods when a work centre was blocked, producing, or down. Operational log — low priority for SA stamping.

mrp.workorder 🟡

Work order. A step-by-step production task within a manufacturing order. Each mrp.workorder is assigned to a work centre and tracks time, quantity, and completion. If a technician (agent) performs assembly work under an SA contract, stamping work orders enables per-SA labour tracking.

mrp.unbuild 🟢

Unbuilding order. Reverses a manufacturing order — breaks a finished product back into its components. Relevant for kit returns and refurbishment workflows. Low priority for SA stamping.

stock.warn.insufficient.qty.unbuild ⚙️

Wizard. Warning dialog for insufficient stock during unbuilding. Transient. No stamp.


7. Quality Control

Module name: quality / quality_control

Quality control integrates with manufacturing, inventory, and maintenance. It ensures that products and processes meet defined standards before goods are released.

quality.point ⚙️

Control point. Defines where in the process a quality check must be performed — on receipts, during manufacturing, before delivery, etc. Also defines what type of check (pass/fail, measure, take photo). Config/template.

quality.check 🟡

Quality check instance. A single quality check performed at a control point — the actual result record. When a technician inspects a solar kit before delivery, a quality.check is created with the result (pass/fail, measured value, photo).

SA governance relevance: If kits are inspected before delivery to a specific SA's customers, stamping the quality check record links inspection results to the SA context. Useful for per-SA quality reports ("failure rate for SA Togo vs SA Kenya").

quality.alert 🟡

Quality alert. A non-conformance report raised when a quality issue is found. Can trigger corrective actions. If a technician reports a field defect under an SA, the alert should carry the SA context.

quality.alert.stage ⚙️

Alert pipeline stage. New, In Progress, Solved, etc. Config.

quality.tag ⚙️

Quality tag. Labels for classifying quality alerts. Config/reference data.


8. Product Lifecycle Management (PLM)

Module name: mrp_plm

PLM manages product design changes and engineering change orders (ECOs).

mrp.eco 🟢

Engineering Change Order (ECO). Tracks a proposed change to a product's BOM, routing, or specifications. Goes through an approval workflow before the change is applied.

SA governance relevance: Low priority. PLM is primarily an R&D / product management concern. If SA-specific product variants are developed (e.g. a kit specifically designed for a country's grid standards), an ECO could carry SA context. Future consideration.

mrp.eco.type ⚙️

ECO type. Categories of change orders (design, engineering, regulation). Config.

mrp.eco.stage ⚙️

ECO stage. Pipeline stages for ECOs (New → Under Review → Approved → Applied). Config.

mrp.eco.tag ⚙️

ECO tag. Classification labels. Reference data.

product.template.attribute.value ⚙️

Product attribute value. Defines variant dimensions (colour: Red/Blue, size: S/M/L). Config.


9. Maintenance

Module name: maintenance

Maintenance tracks equipment upkeep, failure history, and preventive maintenance schedules. Highly relevant to a solar hardware business where physical assets (kits, batteries, inverters) need scheduled servicing.

maintenance.equipment 🟡

Equipment record. Represents a physical machine, vehicle, or asset being maintained. In the solar context, this could represent an installed solar system at a customer site.

Key fields: - name — equipment name / reference - partner_id — customer/location where equipment is installed - maintenance_team_id - technician_user_id — assigned technician - serial_no — serial number (links to physical unit) - category_id — equipment category - maintenance_ids — linked maintenance requests

SA governance relevance: If maintenance equipment represents installed kits under an SA, stamping equipment records enables per-SA asset health reporting. Coordinate with ov.asset which is the current governance wrapper for physical units — avoid duplication.

maintenance.equipment.category ⚙️

Equipment category. Solar Panel, Battery, Inverter, Meter, Full Kit, etc. Config/reference.

maintenance.request 🟡

Maintenance request. A request to perform maintenance on a piece of equipment — either reactive (breakdown reported) or preventive (scheduled service). Created by field agents or automatically triggered by a maintenance schedule.

Key fields: - name — description of the issue - equipment_id — the equipment being serviced - maintenance_typecorrective (breakdown) or preventive (scheduled) - stage_id — current stage in maintenance pipeline - user_id — assigned technician - partner_id — customer/site - schedule_date — planned date - kanban_state — ready / blocked / normal

SA governance relevance: When a field technician (abs.employee) handles a maintenance job under an SA context, the request should carry {actor, sa} to enable per-SA maintenance reports ("how many corrective requests did SA X have this month?").

maintenance.stage ⚙️

Maintenance pipeline stage. New, In Progress, Repaired, Scrapped. Config.

maintenance.team ⚙️

Maintenance team. Groups technicians by specialisation or region. Config.


10. Repairs

Module name: repair

Repairs manages the return, diagnosis, repair, and return of customer-owned items. Distinct from Maintenance (which tracks preventive upkeep of company equipment) — Repairs handles customer returns.

repair.order 🟡

Repair order. Represents the full lifecycle of a customer return — receipt of broken item, diagnosis, parts used, labour, and return to customer (or disposal). In a solar business, this handles battery replacements, controller failures, and kit refurbishments.

Key fields: - name — repair order reference - product_id — item being repaired - lot_idstock.lot — serial number of the unit - partner_id — customer who owns the item - state — draft → confirmed → under_repair → done → cancel - invoice_id — invoice for parts/labour charged to customer - move_id — stock movement for parts consumed

SA governance relevance: When a customer under an SA sends in a broken kit, the repair order should carry {actor, sa} to attribute it to the correct SA for warranty reporting and per-SA repair cost analysis.

repair.line ⚙️

Repair parts line. Components consumed during the repair. Inherits context from parent repair order. No independent stamp.

repair.fee ⚙️

Repair service charge line. Labour or service fee line on a repair order. Inherits from parent. No stamp.


11. Field Service

Module name: industry_fsm (Field Service Management)

Field Service manages on-site service interventions — scheduling technicians for customer visits, tracking time spent, and closing out tasks with invoicing.

project.task (FSM mode) 🟡

Field service task / work order. In FSM mode, project tasks become field service work orders with additional fields for on-site tracking. An agent visits a customer's site, starts a timer, records what was done, and marks the task as done.

Key fields: - partner_id — customer / installation site - user_ids — assigned technician(s) - planned_date_begin / date_deadline - fsm_done — whether the field task is completed - timesheet_ids — time logged on-site - sale_order_id — linked order (for invoicing)

SA governance relevance: Every field visit is an SA-governed activity. Stamping FSM tasks enables per-SA service operations reporting — visits scheduled, time on-site, tasks completed.

project.project (FSM mode) ⚙️

FSM project. The FSM module creates a default project per company. Config/infrastructure.


12. IoT

Module name: iot

The IoT module connects physical IoT boxes and devices (sensors, scanners, printers, scales, screens) to Odoo. IoT boxes are Raspberry Pi units that bridge physical hardware to Odoo's event system.

iot.box 📡 🟢

IoT Box. Represents a physical IoT gateway device (a Raspberry Pi running the Odoo IoT image). Each box has a unique identifier, a local IP, and an SSL tunnel to the Odoo server.

Key fields: - name — human-readable box name (e.g. "Outlet Lomé Scanner") - identifier — unique hardware ID - ip — local network IP address - ip_url — URL to access the box locally - drivers_auto_update — whether to auto-update IoT drivers - device_ids — all devices connected to this box

SA governance relevance: In a solar / energy business, IoT boxes could be deployed at service outlets. An IoT box stamped with x_sa_id would allow "show all IoT devices at outlets belonging to SA X". Low priority today but relevant if outlet-level hardware monitoring is implemented.

iot.device 📡 🟢

IoT Device. Represents a peripheral connected to an IoT box — a barcode scanner, card reader, receipt printer, customer screen, weight scale, or any other USB/serial device.

Key fields: - name — device display name - identifier — unique hardware ID - typeprinter, display, scale, scanner, camera, device - connectionserial, usb, bluetooth, wifi, hdmi - iot_idiot.box — the IoT box this device is connected to - keyboard_layout — for keyboard/scanner devices - display_url — for customer display screens

SA governance relevance: Devices at an outlet under an SA. Low priority today.

iot.trigger 📡 ⚙️

IoT Trigger. Maps a device action (e.g. barcode scanner scan) to an Odoo action (e.g. validate a picking, mark a quality check as done). Configuration linking hardware events to software actions.

iot.channel 📡 ⚙️

IoT Communication Channel. The WebSocket channel through which the Odoo server pushes commands to IoT boxes and receives events from them. Infrastructure.

IoT use cases in solar/energy context:

Use Case IoT Device Odoo Integration
Customer check-in at outlet Barcode / QR scanner Scan customer card → open sales.session
Kit serial registration Barcode scanner Scan kit serial → link to stock.lot / ov.asset
Receipt printing Thermal printer Print payment receipt from account.payment
Payment terminal Card reader / NFC Trigger Lipay / mobile money payment flow
Customer display HDMI display Show order total and payment confirmation
Weight verification Scale Verify package weight before dispatch
Energy meter reading Serial sensor Log meter reading to account.analytic.line

13. Point of Sale (POS)

Module name: point_of_sale

POS is Odoo's retail sales module — a browser-based cashier interface that works offline and syncs when online. Integrates deeply with IoT for scanners and printers.

pos.config ⚙️

POS configuration. Defines a POS setup — which journal, which products, which payment methods, which printers. One config per register/outlet. Config/master.

pos.session 🟡

POS session. A cashier session from open to close. Tracks all transactions, payments, and cash movements during a single shift.

Key fields: - config_id — which POS configuration - user_id — cashier who opened the session - state — new → opening_control → opened → closing_control → closed - start_at / stop_at — session duration - order_ids — all orders in this session

SA governance relevance: If POS is used at outlets belonging to SAs, each session should be attributed to the SA. Compare with the custom sales.session model — if POS replaces custom sessions, the SA stamp must move to pos.session.

pos.order 🟡

POS sale transaction. An individual customer sale at the point of sale. The POS equivalent of sale.order. Contains lines, payments, and customer reference.

Key fields: - session_idpos.session - partner_id — customer (optional in POS — can be anonymous) - state — draft → paid → posted → invoiced - linespos.order.line - payment_idspos.payment - account_move — linked invoice if invoiced

SA governance relevance: POS orders at SA-governed outlets should carry {actor, sa}.

pos.order.line ⚙️

POS order line. A single product in a POS order. Inherits from parent order. No stamp.

pos.payment ⚙️

POS payment. Records a payment method and amount within a POS order. Inherits context from parent order. No stamp.

pos.payment.method ⚙️

POS payment method. Defines accepted payment methods (cash, card, mobile money, Lipay). Config.

pos.category ⚙️

POS product category. Visual grouping of products on the POS screen. Config.

pos.note ⚙️

Order note. Free-text notes added to a POS order line. Config/reference.


14. Purchase

Module name: purchase

purchase.order 🟢

Purchase order. An order placed to a supplier for goods or services. Generates a vendor receipt (stock.picking) and a vendor bill (account.move). Low priority for SA stamping unless channel partners place orders on behalf of SAs.

purchase.order.line ⚙️

PO line. A single product line within a purchase.order. Inherits from parent. No stamp.

purchase.report ⚙️

Purchase analysis view. PostgreSQL view for purchase analytics. Not a real table.

purchase.bill.union ⚙️

Purchase/Bill view. A UI helper combining POs and bills. Not a real table.


15. Fleet

Module name: fleet

Fleet manages company vehicles — cars, motorcycles, trucks — with fuel logs, service records, contracts, and cost tracking.

fleet.vehicle 🟢

Vehicle record. Represents a company vehicle. In a solar field operations context, vehicles are used by field agents for customer site visits. If vehicles are assigned per SA team, stamping enables per-SA transport cost tracking.

Key fields: - name — licence plate - model_id — vehicle model - driver_idres.partner — assigned driver - company_id - state_id — New / Used / Registered / Downgraded / Written Off - acquisition_date - odometer — current mileage

fleet.vehicle.model ⚙️

Vehicle model. Toyota Corolla, Honda CG125, etc. Reference data.

fleet.vehicle.model.brand ⚙️

Vehicle brand. Toyota, Honda, Yamaha, etc. Reference data.

fleet.vehicle.log.fuel 🟢

Fuel log. Records a fuel fill-up with date, litres, cost, and mileage. Tracks fuel consumption per vehicle. SA governance relevance: low — relevant if per-SA transport costs are tracked.

fleet.vehicle.log.services 🟢

Service log. Records a vehicle service event (oil change, tyre replacement, etc.). Same SA relevance as fuel log.

fleet.vehicle.log.contract 🟢

Vehicle contract. Insurance, lease, or maintenance contract for a vehicle. Low priority.

fleet.vehicle.cost ⚙️

Cost entry. A computed/aggregated cost record for a vehicle. Not directly created by users.

fleet.vehicle.state ⚙️

Vehicle state. New / Used / Registered / Written Off. Config/reference.

fleet.service.type ⚙️

Service type. Categories of vehicle services. Config.


16. Human Resources (HR)

Module name: hr

hr.employee ⚙️

Native Odoo employee. Full employee record linked to res.users. Manages payroll, contracts, attendance, leave, and appraisals. In this system, abs.employee is used for free-seat field agents to avoid licensing costs. hr.employee may exist for Omnivoltaic internal staff only.

hr.employee.public ⚙️

Public employee view. A restricted view of hr.employee fields visible to all employees. Not a separate table — a view model.

hr.department ⚙️

Department. Organisational grouping of employees (Sales, Operations, Finance, IT). Config.

hr.job ⚙️

Job position. A role/title within the company (Sales Representative, Field Technician, Finance Manager). Config/reference.

hr.work.location ⚙️

Work location. Office, home, field, warehouse. Reference data.


17. Payroll

Module name: hr_payroll

hr.payslip 🟢

Payslip. Monthly salary calculation for an employee. Contains gross, deductions, net pay, and contributions. Low relevance to SA governance today — internal HR.

hr.payslip.line ⚙️

Payslip line. A single salary rule result on a payslip (basic salary, bonus, tax, CNSS, etc.). Inherits from payslip.

hr.payslip.run ⚙️

Payslip batch. Groups multiple payslips processed together (e.g. "February 2026 Payroll").

hr.contract ⚙️

Employment contract. Defines salary structure, start/end date, and work schedule. Config.

hr.salary.rule ⚙️

Salary rule. Calculation formula for a payslip component (basic × 0.07 for pension, etc.). Config.

hr.salary.structure ⚙️

Salary structure. Groups salary rules for a category of employees. Config.


18. Recruitment

Module name: hr_recruitment

hr.applicant 🟢

Job applicant. A candidate application for an open position. Tracks the hiring pipeline from application to offer. Low SA governance relevance today. Relevant if channel partners recruit agents on behalf of an SA.

hr.applicant.category ⚙️

Applicant tag. Labels for classifying applicants. Config.

hr.recruitment.stage ⚙️

Recruitment stage. New → Screen → Interview → Offer → Hired / Refused. Config.

hr.recruitment.source ⚙️

Recruitment source. Where the applicant came from (LinkedIn, Referral, Website, etc.). Config.


19. Appraisals

Module name: hr_appraisal

hr.appraisal 🟢

Employee appraisal. Periodic performance review. Links to an employee and contains goals, ratings, and feedback. Low SA governance relevance — internal HR.

hr.appraisal.goal ⚙️

Appraisal goal. A specific objective set during an appraisal. Config/template.

hr.appraisal.note ⚙️

Appraisal note. Free-text observation during the review process.


20. Time Off (Leave)

Module name: hr_holidays

hr.leave ⚙️

Leave request. An absence request by an employee — annual leave, sick leave, unpaid, etc. Internal HR process. No SA governance relevance.

hr.leave.allocation ⚙️

Leave allocation. Grants an employee a number of leave days of a specific type. HR config.

hr.leave.type ⚙️

Leave type. Annual Leave, Sick Leave, Maternity Leave, etc. Config.

hr.leave.accrual.plan ⚙️

Accrual plan. Rules for how leave days accumulate over time. Config.


21. Attendances

Module name: hr_attendance

hr.attendance 🟢

Attendance record. Clock-in/clock-out record for an employee. Tracks actual hours worked. If field agents clock in at outlets, the attendance record could carry the outlet and SA context for per-SA labour hours reporting. Low priority today.

Key fields: - employee_id - check_in / check_out - worked_hours (computed)


22. Expenses

Module name: hr_expense

hr.expense 🟢

Expense claim. A single business expense submitted by an employee for reimbursement — fuel, accommodation, mobile data, tools. If field agents submit expenses tied to SA activities, the SA stamp enables per-SA cost reporting.

hr.expense.sheet ⚙️

Expense report. A batch of expense claims submitted together for approval and reimbursement. Inherits SA context from individual expenses if stamped.


23. Project

Module name: project

project.project ⚙️

Project. Groups tasks under a single initiative. Optionally linked to a customer and billed via timesheets. Config/organisational — no stamp needed unless SA-specific projects are tracked.

project.task 🟢

Task. An individual work item within a project. Carries assignee, deadline, stage, and timesheet lines. When used in Field Service mode, becomes a field work order. Low priority for standalone SA stamping — FSM mode stamps are higher priority.

project.task.type ⚙️

Task stage. New, In Progress, Done, Cancelled. Config (kanban columns).

project.tags ⚙️

Task tag. Classification labels. Config.

project.milestone ⚙️

Project milestone. A deadline checkpoint within a project. Config.


24. Timesheets

Module name: hr_timesheet

account.analytic.line (timesheet) 🟡

Timesheet entry. In timesheet context, account.analytic.line records time spent by an employee on a project/task. The same model also stores analytic costs and revenues. If technicians log time on SA-specific jobs, stamping timesheet entries enables per-SA labour cost reporting.


25. Planning

Module name: planning

planning.slot 🟡

Shift / planning slot. A scheduled shift for an employee at a specific time and location. Used for workforce planning and scheduling. If agents are scheduled for SA-specific activities (outlet shifts, site visits), stamping the slot enables per-SA staffing reports.

Key fields: - resource_id — the employee - role_id — planning role (Sales Agent, Technician, etc.) - start_datetime / end_datetime - company_id - sale_line_id — linked to a sale order line (for billable planning)

planning.role ⚙️

Planning role. Job role used for shift assignment (Sales, Technician, Driver). Config.


26. Helpdesk

Module name: helpdesk

helpdesk.ticket 🔴

Support ticket. Fully described in GOVERNED_OBJECTS.md. High priority — both agents and customers create tickets; neither is currently SA-stamped.

helpdesk.stage ⚙️

Ticket pipeline stage. New, In Progress, Solved, Closed. Config.

helpdesk.team ⚙️

Support team. Groups agents and defines SLAs and escalation. Config. Could be aligned 1:1 with SAs in the future.

helpdesk.sla ⚙️

SLA policy. Service Level Agreement rules — response time, resolution time per priority. Config.

helpdesk.sla.status ⚙️

SLA status. Per-ticket SLA tracking record (met / failed). System-maintained.

helpdesk.tag ⚙️

Ticket tag. Classification labels for tickets. Config.


27. Rental

Module name: sale_renting

sale.order (rental) ✅

Rental order. In Odoo 16+, rentals use sale.order with is_rental_order = True. The same stamp fields that cover sale.order apply to rental orders. Already covered.

rental.order.line ⚙️

Rental line. A sale.order.line with rental-specific fields (pickup date, return date, duration). Inherits from parent order.


28. Subscription (Native Odoo)

Module name: sale_subscription

In Odoo 16/17/18, subscriptions are implemented as recurring sale.order records rather than a separate model. The sale.order already carries the SA stamp. No additional objects.

sale.order (subscription) ✅

Recurring orders share the sale.order model with subscription_state field: - upsell — ready for upselling - churned — cancelled - in_progress — active - paused — temporarily paused

Already stamped via sale_order_ext.py.


29. eCommerce & Website

Module name: website / website_sale

website ⚙️

Website record. Represents the Odoo website instance — domain, theme, languages. Config.

website.page ⚙️

Web page. A page on the website with URL, content, SEO settings, and publish state. Content management — no SA stamp needed unless SA-specific landing pages are tracked.

website.menu ⚙️

Navigation menu item. Config.

website.visitor 🟢

Anonymous / identified website visitor. Tracks visitor sessions, page views, and lead generation on the website. If website visitors are attributed to specific SA referral campaigns, this could carry SA context. Low priority.

website.track ⚙️

Page view tracking record. A single page view event. Infrastructure.


30. Blog

Module name: website_blog

Already partially implemented in this codebase — blog.py controller serves blog content via /api/bff/articles.

blog.post ✅ (via API)

Blog article / post. A published article with title, body, cover image, and category. The /api/bff/articles BFF endpoint wraps blog.post for the frontend.

blog.blog ⚙️

Blog / publication. The parent category grouping blog posts (e.g. "News", "Technical Tips"). Config.

blog.tag ⚙️

Blog tag. Classification labels. Config.

article.collection ✅ (custom)

Custom article collection. The codebase adds a custom article.collection model (managed via article_collection.py) for curated content sets. Exposed via /api/bff/article-collections.


31. Live Chat

Module name: im_livechat

mail.channel 🟢

Live chat conversation / channel. Represents a real-time chat session between a customer and a support agent, or an internal channel. When used for customer support, the conversation should be attributable to an SA. Low priority — stamp the parent helpdesk.ticket instead.

im_livechat.channel ⚙️

Live chat configuration. Defines a chat widget for a website — which team handles it, which bot responds first. Config.

chatbot.script ⚙️

Chatbot script. Automated conversation flow. Config.


32. Email Marketing (Mass Mailing)

Module name: mass_mailing

mailing.mailing 🟢

Mass mailing campaign. An email blast sent to a mailing list or a filtered partner set. If SA-specific customer communication campaigns are run (e.g. "Send renewal reminder to all active subscriptions under SA Togo"), the campaign should carry SA context for attribution.

mailing.contact ⚙️

Mailing contact. A recipient in a mailing list. Separate from res.partner — contains only name and email. Reference data.

mailing.list ⚙️

Mailing list. A named group of mailing contacts. Config.

mailing.trace ⚙️

Delivery trace. Records whether a specific email was sent, opened, clicked, or bounced. System-maintained analytics.


33. SMS Marketing

Module name: sms / mass_mailing_sms

sms.sms 🟢

SMS message record. A single outgoing SMS. If agents or the system send SMS messages to customers under an SA (e.g. payment reminders, subscription renewal alerts), the SA context is useful for per-SA communication auditing.

sms.template ⚙️

SMS template. Reusable SMS message template with dynamic fields. Config.

mailing.mailing (SMS type) 🟢

SMS campaign. Mass SMS blast. Same governance relevance as email campaigns.


34. Social Media

Module name: social

social.post 🟢

Social media post. Content scheduled or published on a social account (Facebook, Twitter/X, LinkedIn, Instagram, YouTube). Low SA governance relevance unless SA-specific social accounts are managed.

social.account ⚙️

Social media account. Connected platform account. Config.

social.stream ⚙️

Social media stream. A monitored feed (mentions, comments, messages). Config.

social.stream.post ⚙️

Stream post. A captured post from a monitored social stream. System-maintained.

social.live.post ⚙️

Scheduled post status. Tracks the publish status per platform per social.post. System.


35. Events

Module name: event

event.event 🟢

Event. A physical or virtual event — product launch, training, customer day, installation workshop. If SA-specific customer events are organised (e.g. "SA Togo Customer Training Day"), stamping the event enables per-SA event attribution.

Key fields: - name - date_begin / date_end - company_id - organizer_idres.partner - seats_max / seats_available - registration_ids - tag_ids

event.registration 🟢

Event registration. A customer's sign-up for an event. If the registrant is a customer under an SA, this should carry SA context for post-event follow-up attribution.

event.stage ⚙️

Event pipeline stage. New → Confirmed → Ended / Cancelled. Config.

event.tag ⚙️

Event tag. Classification labels. Config.

event.tag.category ⚙️

Event tag category. Groups event tags. Config.


36. Surveys

Module name: survey

survey.survey ⚙️

Survey / questionnaire. A form with questions for collecting feedback or data. Config/template.

survey.question ⚙️

Survey question. An individual question within a survey. Config.

survey.user_input 🟢

Survey response (session). A customer's completed survey response. If SA-specific customer satisfaction surveys are run, stamping responses enables per-SA NPS or satisfaction reporting.

survey.user_input.line ⚙️

Survey answer line. A single answer to a single question. Inherits from parent response.


37. eLearning

Module name: slides

slide.channel ⚙️

eLearning course. A course with slides, videos, and quizzes. Config/content management.

slide.slide ⚙️

Course content (slide). A single content item (article, video, PDF, quiz) within a course. Config/content.

slide.channel.partner 🟢

Course enrolment. Records that a partner is enrolled in a course. If SA members are trained via eLearning, enrolments could carry SA context for training compliance reporting per SA.

slide.tag ⚙️

Course tag. Classification labels. Config.


38. Sign

Module name: sign

sign.request 🟡

Document signing request. Sends a document for electronic signature — contracts, agreements, delivery confirmations. When an agent gets a customer to sign a solar subscription contract under an SA, the signing request should carry SA context.

Key fields: - template_idsign.template - request_item_ids — signatories - state — sent → signed / cancelled - reference - validity

sign.request.item ⚙️

Signing party. A single signatory in a sign.request. Tracks whether they have signed, when, and from which IP. Inherits from parent request.

sign.template ⚙️

Document template. A PDF with field placeholders for signatures, dates, names, etc. Config.


39. Documents

Module name: documents

documents.document 🟡

Document record. A managed file in the Odoo Documents app — PDFs, spreadsheets, images, contracts, certificates. When an agent uploads a customer document (ID copy, site photo, inspection report) under an SA, the document should carry SA context.

Key fields: - name - folder_id - partner_id — linked contact - owner_idres.users - type — url / binary - attachment_idir.attachment - tag_ids

documents.folder ⚙️

Document folder. Hierarchical folder structure for organising documents. Config.

documents.tag ⚙️

Document tag. Classification labels. Config.

documents.share ⚙️

Document share link. A time-limited public or restricted sharing URL for a document. Infrastructure.


40. VoIP

Module name: voip

voip.phonecall 🟢

Phone call record. Logs an outgoing or incoming call — duration, direction, caller, and linked Odoo record. If agents make customer calls under an SA context, the call log should carry x_sa_id for per-SA communication tracking.

voip.call.list ⚙️

Call list. A pre-scheduled list of contacts to call (call campaign). Config.


41. Discuss (Messaging)

Module name: mail / discuss

mail.message ⚙️

Message / chatter entry. Every chatter note, email, and notification. SA context is on the parent document. Stamping messages directly is redundant and expensive at scale.

mail.activity 🟡

Scheduled activity. A to-do item on a document — call, email, meeting, upload document. If an agent schedules a follow-up activity under an SA context, stamping it enables per-SA activity pipeline reports without joining through the parent document.

mail.activity.type ⚙️

Activity type. Call, Email, Meeting, Document Upload, Sign, etc. Config.

mail.thread ⚙️

Mixin, not a model. mail.thread is a Python mixin class that adds chatter, followers, and activity capabilities to any model. It is not a database table.

res.partner (followers) ⚙️

Document follower. The mail.followers model records which partners follow a document for notifications. Infrastructure — no stamp.

mail.channel 🟢

Direct message / group channel. A persistent conversation between users or with a customer. Low priority for SA stamping.


42. Lunch

Module name: lunch

lunch.order ⚙️

Lunch order. An employee's daily lunch order from a provider. Internal HR benefit — no SA governance relevance.

lunch.product ⚙️

Lunch item. A food item available for ordering. Config.

lunch.supplier ⚙️

Lunch provider. A restaurant or catering company. Config.

lunch.location ⚙️

Lunch location. Canteen or delivery point. Config.


43. Referrals

Module name: hr_referral

hr.applicant (referral) ⚙️

Referred job applicant. An applicant referred by a current employee. Tracks the referral source for reward programmes. Internal HR — no SA governance relevance.


44. Barcode

Module name: stock_barcode

Barcode is an interface overlay on Inventory operations, not a separate model. It adds QR/barcode scanning capability to stock pickings and inventory adjustments. No distinct models — uses stock.picking, stock.move.line, stock.quant, and stock.lot.

IoT connection: Barcode scanners connected via IoT boxes power the barcode scanning interface. When a technician scans a kit's serial at an outlet, the IoT box sends the scan to Odoo's barcode module, which creates or validates a stock.move.line or stock.lot record.


45. Accounting Localisations

Module name: l10n_*

Localisation modules add country-specific charts of accounts, tax configurations, and reporting formats. Examples: l10n_tg (Togo), l10n_ke (Kenya), l10n_gh (Ghana), l10n_fr (France).

These modules do not introduce transaction models — they add configuration records (account.account, account.tax, account.fiscal.position) specific to local regulations.

No SA stamp needed on localisation config data.


46. Complete Object Table

# Model Module SA Stamp
1 res.partner base
2 res.company base ⚙️
3 res.users base ⚙️
4 res.country base ⚙️
5 res.currency base ⚙️
6 ir.attachment base 🟢
7 ir.config_parameter base ⚙️
8 ir.rule base ⚙️
9 sale.order sale
10 sale.order.line sale ⚙️
11 crm.lead crm
12 crm.team crm ⚙️
13 crm.stage crm ⚙️
14 crm.tag crm ⚙️
15 account.move account 🔴
16 account.move.line account ⚙️
17 account.payment account 🟡
18 account.journal account ⚙️
19 account.account account ⚙️
20 account.tax account ⚙️
21 account.analytic.account account 🟡
22 account.analytic.line account 🟡
23 account.bank.statement account ⚙️
24 stock.picking stock 🟡
25 stock.move stock ⚙️
26 stock.lot stock 🟡
27 stock.quant stock ⚙️
28 stock.location stock ⚙️
29 stock.warehouse stock ⚙️
30 stock.scrap stock 🟢
31 mrp.production mrp 🟡
32 mrp.bom mrp ⚙️
33 mrp.bom.line mrp ⚙️
34 mrp.workcenter mrp ⚙️
35 mrp.workorder mrp 🟡
36 mrp.unbuild mrp 🟢
37 quality.check quality 🟡
38 quality.alert quality 🟡
39 quality.point quality ⚙️
40 mrp.eco mrp_plm 🟢
41 maintenance.equipment maintenance 🟡
42 maintenance.request maintenance 🟡
43 repair.order repair 🟡
44 project.task (FSM) industry_fsm 🟡
45 iot.box iot 🟢
46 iot.device iot 🟢
47 iot.trigger iot ⚙️
48 pos.session point_of_sale 🟡
49 pos.order point_of_sale 🟡
50 pos.order.line point_of_sale ⚙️
51 pos.payment point_of_sale ⚙️
52 purchase.order purchase 🟢
53 purchase.order.line purchase ⚙️
54 fleet.vehicle fleet 🟢
55 fleet.vehicle.log.fuel fleet 🟢
56 fleet.vehicle.log.services fleet 🟢
57 hr.employee hr ⚙️
58 hr.department hr ⚙️
59 hr.payslip hr_payroll 🟢
60 hr.contract hr_payroll ⚙️
61 hr.applicant hr_recruitment 🟢
62 hr.appraisal hr_appraisal 🟢
63 hr.leave hr_holidays ⚙️
64 hr.attendance hr_attendance 🟢
65 hr.expense hr_expense 🟢
66 hr.expense.sheet hr_expense ⚙️
67 project.project project ⚙️
68 project.task project 🟢
69 project.milestone project ⚙️
70 account.analytic.line (timesheet) hr_timesheet 🟡
71 planning.slot planning 🟡
72 helpdesk.ticket helpdesk 🔴
73 helpdesk.team helpdesk ⚙️
74 helpdesk.sla helpdesk ⚙️
75 mail.activity mail 🟡
76 mail.message mail ⚙️
77 sign.request sign 🟡
78 sign.template sign ⚙️
79 documents.document documents 🟡
80 documents.folder documents ⚙️
81 mailing.mailing mass_mailing 🟢
82 sms.sms sms 🟢
83 event.event event 🟢
84 event.registration event 🟢
85 survey.user_input survey 🟢
86 slide.channel.partner slides 🟢
87 website.visitor website 🟢
88 voip.phonecall voip 🟢
89 social.post social 🟢
90 product.template product
91 product.product product ⚙️
92 product.category product ⚙️
93 product.pricelist product ⚙️
94 abs.employee custom ⚙️ (IS the actor)
95 abs.subscription custom
96 sales.session custom 🐛 (wrong name in _GOVERNED_MODELS)
97 payment.attempt custom
98 payment.request custom 🔴
99 ov.serviced_account custom ⚙️ (IS the anchor)
100 ov.membership custom ⚙️ (IS the relationship)
101 ov.asset custom
102 ov.outlet custom ⚙️