How to Implement Custom Sequence Generation with ir.sequence in Odoo?


✅ What is ir.sequence?


In Odoo, ir.sequence is a model used to generate unique and structured numbers, commonly for documents such as invoices, orders, or custom records. These sequences help maintain readable, consistent, and traceable references.


📌 When to Use Custom Sequences?

  • Generating unique numbers for custom models (e.g., customer.ticket, asset.tag)
  • Adding prefixes or date-based formatting to identifiers
  • Ensuring sequence continuity across companies or configurations


🛠 Step-by-Step: Define a Custom Sequence for a Model


1. Define a Sequence Record in XML


<record id="seq_customer_ticket" model="ir.sequence">

    <field name="name">Customer Ticket Sequence</field>

    <field name="code">customer.ticket</field>

    <field name="prefix">TIC/%(year)s/</field>

    <field name="padding">5</field>

    <field name="number_next">1</field>

    <field name="number_increment">1</field>

    <field name="use_date_range">False</field>

</record>


  • code: A unique identifier used to call the sequence
  • prefix: Can include date variables like %(year)s, %(month)s
  • padding: Number of digits (e.g., 00001)
  • use_date_range: If set to True, the sequence restarts monthly/yearly



2. Use It in Your Model's create() Method


from odoo import models, fields, api


class CustomerTicket(models.Model):

    _name = 'customer.ticket'

    _description = 'Customer Ticket'


    name = fields.Char(string='Ticket Number', required=True, copy=False, readonly=True, default='New')

    subject = fields.Char(string='Subject')


    @api.model

    def create(self, vals):

        if vals.get('name', 'New') == 'New':

            vals['name'] = self.env['ir.sequence'].next_by_code('customer.ticket') or '/'

        return super(CustomerTicket, self).create(vals)


  • If no custom name is provided, it auto-generates one using the defined sequence.
  • next_by_code('customer.ticket') fetches the next number in the sequence.


🔄 Example Output


If your prefix is TIC/%(year)s/ and padding is 5, the generated name would look like:

TIC/2025/00001

TIC/2025/00002



🔐 Multi-Company / Date Range Sequences


  • Sequences can be company-specific by setting the company_id.
  • Enable date ranges to reset yearly (e.g., invoice sequences).



✅ Summary Table


Feature

ir.sequence Capability

Custom prefix

✅ Yes (%(year)s, %(month)s)

Padding (e.g., 00001)

✅ Yes

Per-company support

✅ Yes

Date-based reset

✅ Yes (use_date_range=True)

API Usage

next_by_code(code)