Customizing Invoice Numbering by Product Category in Odoo 16

What will you learn?

In this tutorial, you will learn how to customize invoice numbering based on product categories in Odoo 16. By implementing a custom invoice numbering system, you can efficiently manage different product types or services offered by your business. This customization can streamline accounting practices, enhance reporting accuracy, and improve inventory management.

Introduction to Problem and Solution

Businesses often require distinct invoicing sequences to differentiate between various product categories or services they offer. In Odoo 16, customizing the invoice numbering system based on product categories can significantly benefit organizations. By tailoring invoice numbers according to specific criteria, companies can achieve better organization and efficiency in their invoicing processes.

To address this challenge, we will create a module in Odoo that overrides the default invoice numbering mechanism. This involves extending the account.move model to include logic that determines the sequence based on product category. Leveraging Odoo’s extensibility features such as inheritance and XML declarations will allow us to achieve our goal without disrupting core functionalities.

Short Intro

Learn how to enhance your business operations in Odoo 16 by customizing invoicing processes with unique numbering sequences for different product categories. Improve your operational efficiency with tailored invoice identification.


from odoo import models, fields

class AccountMove(models.Model):
    _inherit = 'account.move'

    def _get_invoice_sequence(self):
        """Override method to determine invoice sequence based on product category."""
        if self.invoice_line_ids:
            # Example condition: Use the first line's product category to determine the sequence
            product_category = self.invoice_line_ids[0].product_id.categ_id
            if == "Your Product Category Name":
                return self.env.ref('your_module_name.sequence_your_product_category')
        return super(AccountMove, self)._get_invoice_sequence()

# Copyright PHD
<!-- XML for defining custom sequence -->
<record id="sequence_your_product_category" model="ir.sequence">
    <field name="name">Your Product Category Sequence</field>
    <field name="code">account.move</field>
    <field name="prefix">YPC/%(year)s/</field>
    <field name="padding">5</field>
    <field name="company_id" eval="False"/>

# Copyright PHD


In the provided solution:

  • We extend the AccountMove model using inheritance (_inherit = ‘account.move’) to add additional logic without modifying the base code of Odoo.
  • The _get_invoice_sequence method is overridden to determine which sequence an invoice should use during creation.
  • Within this method, we check for lines in the invoice (self.invoice_line_ids) and use the associated product’s category from the first line (product_id.categ_id) as a criterion.
  • Based on conditional checks (e.g., matching against “Your Product Category Name”), we return a specific predefined sequence for that category using self.env.ref.
  • If none of the conditions match or no lines are present, calling super() ensures fallback onto Odoo�s default sequencing mechanism.

The XML snippet defines a new sequence with its prefix and padding configuration corresponding directly with our chosen categorization strategy.

    1. How do I apply multiple conditions for different categories? You can expand the _get_invoice_sequence method with more conditional checks and return appropriate sequences defined similarly in XML records.

    2. Can I use attributes other than name for categorization? Absolutely! You can modify conditions within _get_invoice_sequence using any attribute of product.category, like IDs or custom fields you�ve added.

    3. What happens if no products match my specified categories? The override falls back onto Odoo�s default invoicing sequence thanks to calling super() at the end of _get_invoice_sequence.

    4. Will these changes affect existing invoices? No, changes will only apply moving forward from deployment; past invoices retain their original numbers unless manually edited.

    5. How does this impact performance? Minimal impact is expected since checks occur during invoicing operations already innate within workflows�though extensive customization might necessitate performance tests depending upon your specific setup size and activity levels.

    6. Is it possible to revert back easily? Yes! Disabling or uninstalling your custom module would remove these overrides reverting behavior back without affecting other system parts assuming standard best practices were followed during development (e.g., not modifying core models directly).

    7. Do I need special permissions or settings enabled in Odoo before starting? Ensure you have administrative access rights along with development mode enabled if making changes directly via UI interfaces alongside necessary technical knowledge�or support�to safely execute modifications described here.

    8. Can this implementation be extended beyond products/categories? Indeed! By adjusting methods within inheritances like shown above alongside corresponding data models (and potentially views), similar approaches could tailor numerous other aspects aligning well beyond mere categorizations per se.

    9. Does upgrading Odoo affect customized modules? Potentially yes�it�s essential always reviewing release notes plus testing comprehensively within separate staging environments ahead applying updates broadly ensuring compatibility remains intact.


Customizing invoice numbering by product categories enhances organizational efficiency enabling finer control over billing processes suited toward individual business needs leveraging modular design principles inherent within platforms like

Ododo thereby fostering improved financial clarity amongst myriad potential benefits accordingly deployed correctly mindful overarching architectural considerations therein entailed.

Leave a Comment